@neiraza

2匹の怪獣が寝た後にプログラマーしてる、最近はサイバーエージェントでゼミ長もしてる僕のネタ帳

blockでコールバックを書いたった

blockでコールバックを書く

いい加減、delegateばっかだと、あっちこっち読むのが大変なので書いてみた
まず、呼び出される側から。

// BlockSample.h

#import <Foundation/Foundation.h>

typedef void (^BlockSampleCallBack)(NSArray *foo);

@interface BlockSample : NSObject
- (void)hoge:(NSString *)fuga callback:(BlockSampleCallBack)callback;
@end

typedefで定義してするほうが可読にいいよねってことらしい。

// BlockSample.m

#import "BlockSample.h"

@implementation BlockSample

- (void)hoge:(NSString *)fuga callback:(BlockSampleCallBack)callback
{
	NSArray *array = @[@"りんご", @"ごりら", @"らぶらぶ"];
	callback(array)
}

@end

次に呼び出し側を書く。

// CalledBlockSample.m

// いろいろと割愛

- (void)moDMP
{
	// BlockSampleがシングルトンだったとして...
	[[BlockSample] sharedManager] hoge:@"これはテストだ" callback:^(NSArray *foo) {
	NSLog(@"アホな配列がやってくるお %@", foo);
	}];
} 

// いろいろと割愛

CoreDataのサンプルでハマった?

もし、あなたが

Receiver type 'NSManagedObjectContext' for instance message is a forward declaration

でハマったら、

たぶん、サンプルではCoreDataのimportがpchファイルに書いてあるはず。


そんなiOS、CoreDataを始めますって方におすすめなのがこの本。

iOS Core Data徹底入門

iOS Core Data徹底入門

DBって何だよ(笑)ってレベルからでも、読みやすいと思われ。

ACTION REQUIRED: Google Play Merchant In-app Billing Sample Code Security Update

ACTION REQUIRED: Google Play Merchant In-app Billing Sample Code Security Update
ってメールがきた

diffしてみたけど、ほんと些細な違いだった。
その違いでやられちゃう人もいるんだろけど。

In-app billing v3を使ってて、Rev5よりも古いRevのSampleを丸パクなアプリ
特にIabHelper.javaSecurity.javaを丸パクはアウト

purchaseの内容をサーバ側でチェックする作りになっていない

この辺に心当たりのある方は、
In-app Billing Rev5が来ているのでチェックしよ。

UIAlertViewのdelegateでダラダラすんの禁止

UIAlertViewでok/cancelをタップした後の処理ってどうしてます?

delegateだけで対応すると、
複数のUIAlertView扱っちゃうと、分岐の嵐。

アラートダイアログが消えたら、○○するとかでも良いのかもだけど、
後々、UIKitが対応してくれるとしたら、blockでやってくれるはず。
また既に多くの人が、そーしてるはず。そいうライブラリもあるし。

あとは、カテゴリにしといてくれないと使いづらい。
シンプルにおさめると、こんなんでいいはず。


参考 UIAlertView の delegate 束縛を解放しよう | mixi Engineers' Blog

GMTな文字列をNSDateなローカル時間に変換した

iOSAndroidをいったりきたりしているうちに、
この単純な対応方法を忘れてしまったので書いておく。

そもそも、NSDateのカテゴリとかで残ってないのが不思議なんだけど。
前に作ってた時は、どーしてたんだろか。

基本方針として、
NSStringやNSDateのカテゴリとして作成しておく。

んで、呼び出す以上。

Android Spinnerでkey-valueを使うには?

今日は僕の誕生日なので、誕生日ネタを書くことにした。

皆さんもよく唐突に、誕生日を公開しちゃおっかなーて時があるかもしれない。
そんな時に思うのが、

「せんせーい、たんじょうびって、XXXX年とか入るんですかー?」

って事だとおもう。

画面イメージでいうと、こんな感じ。

f:id:redogu:20130829100350p:plain
iPhone, Androidアプリ「Eyeland」よりAndroid版の画面を拝借
Copyright (c) Oceans Inc. All Rights Reserved.

AndroidだとSpinnerでつくれるやーと思ってたんだけど、
「すべて公開とか」表示している名称と、
名称に紐づけたい区分値の管理の管理の仕方が見つからない。

あれー、そいうの標準で用意してないのかなーと思いつつ、
誕生日だしせっかくなので、作ってみた。

  • FormActivity.java : Spinnerを表示したい画面さん
  • KeyValueAdapter.java : SpinnerにぶっこむAdapterを毎回プライベートに持つのもなんだし
  • SpinnerHelper.java : SpinnerにぶっこむAdapterをarrays.xmlから召還
  • SpinnerObject.java : getter, setterががが
  • arrays.xml : 「表示したい内容」と「表示したい名称と区分値の紐付け」

以下、ソースですけど、
こんなの、もっと簡単に標準で用意してないんすかね
教えてエロい人。

pod installできなくて困っていた件を解決した

気づいたら、こんなことになっていて、、、

> Installing MBProgressHUD (0.7)
 > GitHub download
   $ /usr/local/bin/git config core.bare
   true
   $ /usr/local/bin/git config core.bare
   true
 > Updating cache git repo (/Users/togu/Library/Caches/CocoaPods/GitHub/ef81a51251a828eea52cbd59e57827b0007c9dba)
     $ /usr/local/bin/git remote update
     error: cannot open FETCH_HEAD: Permission denied

[!] Pod::Executable remote update

error: cannot open FETCH_HEAD: Permission denied

言われた通りの場所が、rootになってた
なんでだろー?と思いつつ自分の権限にかえて、pod installで決まり

# ls -l /Users/togu/Library/Caches/CocoaPods/GitHub/ef81a51251a828eea52cbd59e57827b0007c9dba

-rw-r--r--   1 root  staff  6028  8 19 18:54 FETCH_HEAD 

# sudo chown togu:staff