2014年6月30日月曜日

バイト長で文字列を区切る

以下の場合は改行を挟むパターン。

NSMutableString *mstr = [NSMutableString stringWithString:cellTitleLabel.text];

for (int i = 0; i < [cellTitleLabel.text length]; i++) {
    NSString *temp = [cellTitleLabel.text substringToIndex:i]; 
    if ([temp lengthOfBytesUsingEncoding:NSUTF8StringEncoding] > DETAIL_TITLE_LENGTH_AS_BYTE)     {
        [mstr appendString:@"\n"]; 
        break; 
    }
}

審査で蹴られたアプリがiTunesConnectから削除できない

・・・っていって問い合わせフォームから投げたら、返ってきた。

You can delete an app from iTunes Connect if it has at least one approved version and is in one of the following states:

Prepare for Upload
Waiting for Upload
Invalid Binary
Developer Rejected
Rejected
Metadata Rejected
Developer Removed from Sale
Removed from Sale

If the option to delete the app is not available,
make sure that the app is removed from sale,
is not part of a Game Center group, and is not in review.

「delできるのは以下のステータスだよ」
「できないときは、AppStoreから強制削除された場合、ゲームセンターに追加されてる場合、レビュー中の場合じゃないか確認してね」

って感じか。

今の状態は「Waiting for Upload」かつ、
価格設定等すべて破棄した状態なので削除できないわけはないが、できないまま。

・・・バグじゃねえのかなコレ。
もっと問い合わせ増えれば見直されるかもしれん。
時間の無駄っぽいから今のところは諦める。

自作アプリの審査開始が遅い・・・7日経過

先週23日にアップロードしたNewsCenterがまだ審査開始にならない。

ふと気になって平均審査期間確認したが、
https://developer.apple.com/news/
・・・「5日以内に処理される確率 79%」のまま。

単に21%に引っかかってるのか、それとも何か問題があるのか。
気になる気になる。

てか大体審査待ちの間って何してんのかね。静的解析?


2014年6月29日日曜日

サーバーをレンタルしました。そしてWordPressをインストール。

厳正なる比較検討(10分)の結果、サーバーはHostGatorとた。

お値段と、評判と、アレゲなサイトをホストすることも可能な海外鯖ということで。
いや、健全なサイト作りますけどね、ええ。

導入→WordPressインストールまではこちらが参考になりそうです。
HostGator日本語ガイド
辿り着く前に決めちゃったけど。

ネットでHostGator調べても、ちょっと古い情報が多かったのが気になった。
(期間絞ってググれって話ですが)
曰く、コントロールパネルが日本語対応してる、とか
曰く、WordPressの簡単インストール機能はない、とか。

まあ英語で平気なんですけどね、俺らのApple様のお陰で慣れたよ。
簡単インストールがあるのは嬉しい誤算。
コンパネまあまあ見やすい。下の方行くとRailsのStartボタンとかあって、結構遊び甲斐はありそう。


















で、WordPressインストールしてみたんだけど、DNSが浸透していない(?)せいなのかWPのコンパネにアクセスできなかった。
ここまでで何か間違ってるとも思えないので一日寝かせることとする。

2014年6月28日土曜日

V-プリカが使えなくなっていた件。てか月額使用料には使えない件。

昨日、V-プリカ調達したっすよって書いたんですけど。
ムームードメインでの支払いしようと思ったら、「エラー このカード使えません」

(  ゚д゚)ポカーン

で、調べてたらでるわでるわ。

使い勝手が悪化したVプリカ
お二方とも、自分と同様にサーバー費的なものを支払おうとされて模様。
要するに、買い物とかには使えるけど期間利用料なんかの支払いには使えなくなったらしい。

・・・・ないわー。ホントないわー。マジないわー。
わざわざ買って使えないとかないわー。
VISAカードと同じようにつかえないんじゃん。
ドメインの更新にも使えないし、海外サーバーの契約にも使えない。つかえねーよ!?

↓このページ、TOPのどこから辿れるんだよw

3ヶ月以内に使わないと保管料引かれるし、ささっと使い切りたいところ。

何買おうかなああああああああああああああああああああああああああああああああああああああああああああああああああああああ?

2014年6月27日金曜日

サーバー代とか払う用にV-プリカを購入した。

V-プリカ
購入したっていっても前から何回か使ってるんですが、金額たりなそうなので足してきた、という話。

サーバー代やらシェアウェア代を払うのに、普段使いのクレカは使いたくない、
という人にピッタリなのがV-プリカ。

VISAのクレカとして使用できる仮想プリペイドカード。といえばいいものか。

→ 【追記】つかえなくなってましたー m9(^Д^)プギャー

SublimeText買うのに最初買ったんだよな。
・・・最近肝心のSublime使ってねえ。結構高いのに。

クレカ払いが便利でいいけど、海外の怪しい?サイトというか、とにかくAmazon以外でクレカ使いたくねえよ、という方におすすめ。

なんかミクさんデザインができてた。






可愛くても、物理的なカードをもてるわけではないので意味ないけれども。


2014年6月26日木曜日

WordPressとWordPress.comの違いとか。

暇になったので、流行りもんのWordPressを使ってみようと思う(遅い)。

WordPressとは?
→ オープンソースのブログソフトウェア。CMSとしての利用も多い。

WordPress.comって要するにWordPress公式かと思ってたが違った。
.comの方はWordPressを使ったレンタルブログサービスだ。

WordPress公式はhttp://wordpress.org/ね。
無印と.comはなにが違うんじゃって記事はやっぱり.comの記事にあった。

.comの方はカスタマイズに制限があるというか、豊富なアドオンが使えないようなので
無印をインストールして使用していこうと思う。

が、サーバーを借りないと行けないな。検討中である。
またサーバーが増えてしまう。めんどい。

2014年6月25日水曜日

ソーシャル関連 調査メモ

後々、アプリに実装したいAPI類。

【カウンター(コメント件数取得)】
Facebook
http://graph.facebook.com/<取得対象のURL>
→ シェア数が取得できるようだ。
  FBだと、シェア数、Like数、コメント数とかあるけど、
  どれが人気記事の指標としてふさわしいか?

Twitter
http://urls.api.twitter.com/1/urls/count.json?url=<取得対象のURL>

はてなブックマーク
http://api.b.st-hatena.com/entry.count?url=<取得対象のURL>

【特定ページのコメント取得】
https://graph.facebook.com/comments/?ids=<取得対象のURL>

Graph APIで新コメント欄の返信機能を扱う

 

2014年6月24日火曜日

今後の開発計画

マジで書くことなくなった。
作りかけてたものが一段落しちゃったのでやる気ゼロだ。
だので、今後の予定をちょっと書き出しながら整理する。

① アプリ「2chbuzz」
  → 広告入れたい。広告入れたいけど、操作性というかUI損ねたくないので形が難しい。
   どうしたもんか。

② アプリ「News Center」
  → メインで拡張していきたい。新着件数とFBコメント・tweet表示したい。
    API調べないと。あとこれも広告。

③ アプリ「SSS Cam」
  → 正直どうしようもない。ただデフォカメラ準拠を網羅できたので
    なんか別のネタカメラアプリか何かに転用して、収益化を図る。

④ アプリ「半角カタカナ変換」
  → かなりどうでもいいが、結構レビュー書いてくれてるので
    要望機能の追加とUIの整理等はする。広告は要らんだろ。
    競合多い中、使ってもらえればOK。

⑤ WordPressの勉強
   → ツールの使い方とホスト先の検討、このブログの移行。
    PHP触らないでどこまでできるもんなのか?
    アドオンもいっぱいあるみたいなので楽しみだ。
    向こう一週間はコレをやる。 

2014年6月23日月曜日

オブジェクトのクラスの判別

オブジェクトの型が何が分からない場合、isKindOfClassで検証できるようだ。
まあ何の型が入ってるか分からない場合ってあんまないけど、
以下の場合、tempにArrayが入ってるか、Arrayの1要素のDictionaryが直接入ってくるか、
外部からのデータ文字列に依存するためこのような方法になった。

                if ([temp isKindOfClass:[NSArray class]]) {
                    _feedDataItems = temp;
                }else{
                    _feedDataItems = @[temp];
                }



2014年6月22日日曜日

カメラアプリ「SSS Cam」がリリースされました








逆になぜ審査通ったのか。
カメラアプリ「SSS Cam」がリリースされました。

静音カメラとして開発したものの「デフォの音ならないと駄目だよ」 つって審査蹴られてた例のアレ。
音出すようにしてしまったら他に目立った機能もなく、
「デフォルトのカメラアプリと機能差殆ど無いから審査NG」とか
言われるのを覚悟していたが問題なくリリースされてしまった。

い、いいのか?まあ自分はもちろんありがたいが。
今回は有料アプリとしてみた。あまり売れないと思うけども。
カメラアプリというジャンル自体はたぶんiOS端末で開発する限りなくなることはないから、
後々に役に立つことに淡い期待を抱く。

・・・まあ工数分くらい回収できると一番いいけれども。
 

2014年6月21日土曜日

UINavigationbar上のフォント等の設定

設定するのが面倒だ・・・。
フォントなどなど弄りたければ、label作って入れ替える。

    UILabel *title = [[UILabel alloc] initWithFrame:CGRectZero];
    title.font = [UIFont boldSystemFontOfSize:FONTSIZE_HEADER];
    title.textColor = COLOR_TITLE;
    title.text = @"Mews";
    title.textAlignment = NSTextAlignmentCenter;
    [title sizeToFit];
    self.navigationItem.titleView = title;

2014年6月20日金曜日

UITableView上のTextFieldで入力中にキーボードで隠さないようにする

TextField上で編集する際にキーボードが表示され、覆いかぶさってしまうことの回避方法。
表示中のみtableにinsetを設定する。

<UIEdgeInsetsの参考>
http://runlooprun.wordpress.com/2011/02/20/uiedgeinsets/

         #define INSET_KEYBOARD 260.0f                //キーボード+予測変換欄の高さ
         #define INSET_BAR 60.0f                      //NavBarの高さ
        //編集開始時
        UIEdgeInsets insets = UIEdgeInsetsMake(INSET_BAR, 0.0f, INSET_KEYBOARD, 0.0f);
        _keywordTableView.contentInset = insets;
        _keywordTableView.scrollIndicatorInsets = insets;
        //編集終了時
        UIEdgeInsets insets = UIEdgeInsetsMake(INSET_BAR, 0.0f, 0.0f, 0.0f);
        _keywordTableView.contentInset = insets;
        _keywordTableView.scrollIndicatorInsets = insets;

2014年6月19日木曜日

UIBarButtonItemのフォントサイズ変更

UIBarButtonで、『<』『>』とか『ー』『+』をボタン画像代わりに使用しているので、
大きさをあわせるためにフォントサイズを変更。

    //特定のボタンのサイズを変更
    [_backButton setTitleTextAttributes:@{NSFontAttributeName : [UIFont boldSystemFontOfSize:20.0]}
                               forState:UIControlStateNormal];
    //ボタン全部一括で設定したければこっち
    [[UITabBarItem appearance] setTitleTextAttributes:@{NSFontAttributeName : [UIFont boldSystemFontOfSize:20.0]}
                                  forState:UIControlStateNormal];

2014年6月18日水曜日

日付の文字列のフォーマットを変更する


"Fri, 13 Jun 2014 21:08:14 GMT" → "2014/06/13 (Fri) 21:08:14" と変換したい。


まあ、日付文字列→日付→日付文字列の変換。
これだけでもめっちゃ面倒・・・。
ましな方法ないんだろうか。

NSDateFormatterを使用する際にnilが帰ってきてしまったため、
フォーマット文字列の指定を最初疑ったが原因はロケールの指定だった。

<日付のフォーマット指定の参考>
http://technical-iphone.blogspot.jp/2010/05/blog-post_06.html


    NSString* dateStr = @"Fri, 13 Jun 2014 21:08:14 GMT";
    dateStr = [dateStr stringByReplacingOccurrencesOfString:@" GMT"
                                                 withString:@""];
    NSDateFormatter* fmtToDate = [NSDateFormatter new];
    [fmtToDate setDateFormat:@"EEE, dd MMM yyyy H:mm:ss"]; //Fri 13 Jun 2014 21:08:14
    [fmtToDate setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]];
    [fmtToDate setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"PST"]];
    
    NSDate* date = [fmtToDate dateFromString:dateStr];
    
    NSDateFormatter* fmtToStr = [NSDateFormatter new];
    [fmtToStr setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]]; // Localeの指定
    [fmtToDate setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"PST"]];
    [fmtToStr setDateFormat:@"yyyy/MM/dd (EEE) HH:mm:ss"];
    
    dateStr = [fmtToStr stringFromDate:date];

2014年6月17日火曜日

静音カメラの審査レビュー変遷

俺氏「静音カメラアプリ作った」
 ↓
林檎「デフォルトでシャッター音が出ないアプリはNG。古事記にもそう書いてある。」
 ↓
俺氏「マナー時には音鳴らないように、非マナー時は音選べるようにしました」
 ↓
林檎「デフォの音以外が鳴るアプリはNG。」
 ↓
俺氏「じゃあ普通の音が鳴るようにします。」
 
これもうデフォルトのカメラと変わらんからまた蹴られるんじゃねーかな(白目

なんか、AppStoreで配布されてるアプリ見て、
「こんなの俺でも作れるわwwww楽勝っしょwwww」
つって作ってみたら審査通らないケースが多い。

まあ審査基準が変わってるんだろうが、それならAppStoreのアプリも取り下げさせろよ。
よっぽど問題ある(エロとか)場合しか取り下げられないみたいだが。

ネタに便乗するんじゃなくて、本当にクリエイティブな仕事をしないと駄目そうだ。

明日から本気出す。明日からね。

2014年6月16日月曜日

100記事更新を達成したので記念

( ・∀・)ノ このブログの公開記事数が、100件になりました。

だからなんだつっつー話ですけれども、継続できたのはいいことだ!
ほとんどアクセスないけどな!

もともとは、自作アプリのサポートURLに設定するサイトが必要だから、という理由で作ったこのブログ。
当初は全く更新も続かず、どうしたもんかと思ったけれど。
まあ家でプログラミング自体あまりしていなかったからネタが無いのは当たり前・・・
というのは言い訳だろうなあ。
今は自宅で自作アプリの開発に注力しているので、
8月くらいまでは毎日更新したいところだけどいい加減ネタのストックは尽きた(´・ω・`)

だがしかしネタがないということは開発が足りないということだ!!

何か作る → ネタができる → ブログ書く → ネタ尽きる → なんか作る

_人人人人人人_
> 永久機関 <
 ̄Y^Y^Y^Y^Y ̄

とりあえず、来月の100日連続毎日更新を次の目標に頑張ろう。
それが済んだらWordPressに移行したいけどね。

Segue実行の可否を判断

というかSegueは「実行する」という表現でいいものか。
cellをタップして画面遷移する際、中の設定値により遷移していいか判断する処理。

//Segue実行可否
- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier
                                  sender:(id)sender{
    
    UITableViewCell *cell = sender;
    UITextField *cellTextField = (UITextField*)[cell viewWithTag:2];
   
    if ([cellTextField.text isEqualToString:@""]){
        LOG_CURRENT_LINE(@"%d", NO);
        return NO;
    }else{
        LOG_CURRENT_LINE(@"%d", YES);
        return YES;
    }
}

2014年6月15日日曜日

ナビゲーションバーへのボタン追加

ナビバーの右端にボタンを追加する場合。

    UIBarButtonItem* button = [[UIBarButtonItem alloc]
                               initWithTitle:@"Edit"
                               style:UIBarButtonItemStylePlain
                               target:self
                               action:nil];
    
    self.navigationItem.rightBarButtonItem = button;


複数ボタンを追加したい場合、rightBarButtonItemsに配列で設定可能。

2014年6月14日土曜日

@から始まる表現(コンパイラディレクティブ)の入力補完

こんなんあるんだね。
@入力したら出てきた。


ArrayとDictionaryの初期化はたまに使うけれど。

この入力補完昔はなかったよねえ?
気づいてなかっただけだったらアホす(´・ω・`)

2014年6月13日金曜日

SyntaxHighlighterの設置手順

書くことねえ!
書くことねえってことはアプリの開発を怠って酒ばっか飲んでいるということだ!
書くことないので、遡ってブログのSyntaxHighlighterの設置手順をば。

参考・Bloggerでの手順
http://naichilab.blogspot.jp/2013/04/blogger-syntax-highlighter.html


① 対象の言語選択選んでDL
  http://www.way2blogging.org/widget-generators/syntax-highlighter-scripts-generator

② お好みの配色を選ぶ
  http://alexgorbatchev.com/SyntaxHighlighter/manual/themes/

③ ちょっとカスタマイズ
  http://wada811.blogspot.com/2012/02/bloggersyntaxhighlighter.html

④ Bloggerでの参照設定
  http://naichilab.blogspot.jp/2013/04/blogger-syntax-highlighter.html

⑤ 投稿。指定のタグで囲む。
  <pre class="brush: objc">
     ここに任意のソースコード
  </pre>

なお、指定タグは都度コピペするの面倒なので、
「タグ」の変換候補に各環境で登録しておくと便利。

2014年6月12日木曜日

2chまとめリーダー「2chBuzz」がリリースされました









えー、リジェクト14回、1年半にも渡る永き戦いを終え、ついに。

拙作、2chまとめリーダー「2chBuzz」がリリースされました。

・・・リリースされんじゃねーかよ!諦めてたよ!なんなんだよ!
なにがなんでもリリースさせない感を感じていたけど(レビュー文から)
やっぱり審査基準変わるのかね?定期的に審査投げてたらついに通った。

いやーつかれました。
でもこれからサーバー側改善せんと。

2014年6月11日水曜日

reverseGeocodeLocationでエラー「Error Domain=kCLErrorDomain Code=8 "The operation couldn’t be completed. (kCLErrorDomain error 8.)"」

reverseGeocodeLocationでエラーになった。

Error Domain=kCLErrorDomain Code=8 "The operation couldn’t be completed. (kCLErrorDomain error 8.)"

原因は、渡したlocationがNilだったため。
    _locationManager.delegate = self;
    [_locationManager startUpdatingLocation];
とかするの忘れてたze。

[_geocoder reverseGeocodeLocation:_locationManager.location
                        completionHandler:^(NSArray *placemarks, NSError *error) {
                            
                            if (error) {
                                //こっちに落ちて取得できない
                                LOG_CURRENT_LINE(@"%@", error);
                            } else {
                                if (0 < [placemarks count]) {
                                    CLPlacemark *p = [placemarks objectAtIndex:0];    
                                    //いろいろやる


                                }else{
                                    LOG_CURRENT_LINE(@"(取得できませんでした)");
                                }
                            }
                        }];

2014年6月10日火曜日

Google News APIについて調べ中。






ニュースリーダー作成中につき、調査中。

ニュース検索の方法
http://www.crystal-creation.com/web-app/tech/web-api/google/search/news/#rss-feed
→ 結果はRSS(xml)で取得

ニュース検索のジャンルのオプション
http://www.crystal-creation.com/web-app/tech/web-api/google/search/news/parameter.htm

ニュース検索のオプション詳細(非公式)
blog.slashpoundbang.com/post/12975232033/google-news-search-parameters-the-missing-manual
→ 取得件数・ソートの制御可能な模様。

ついでにGoogleトレンド
http://www.crystal-creation.com/web-app/tech/search-engine/google/trend/
→ ・・・廃止済みのようだ。リンク先404。

商用利用可能か調べた方がよさそうな。
クレジット表記のみで大丈夫だといいけれど。



2014年6月9日月曜日

validate時のエラー「Code Sign error: No codesigning identities found 〜」

またもや審査Up時にエラー。

Code Sign error: No codesigning identities found: No codesigning identities (i.e. certificate and private key pairs) that match the provisioning profile specified in your build settings (“SSSCam”) were found.

まあコードサインが一致しませんですよ、って話なんだけどどこ確認しても間違ってない。
itunesconnectでアプリのID確認してDistributionプロファイル確認して、
プロジェクトの設定見なおしても治らない。

四時間かかって発狂したあたりで気分転換にPC再起動してもう一度itunesconnect確認したら、
・・・provisioningとかいろいろできてなかった。てか消えてた?
全部作り直して解決。

なんで消えたか全く分からん。Firefoxでやってたんだけどなんか変にキャッシュされたんだろうか?
次からは念の為にsafari使うようにしよう・・・。回避できるか分からないけど。

2014年6月8日日曜日

NSDataからNSStringへの変換

最初エラー出してしまった。
init alloc がnewでかけるようになったから間違ってしまった。

誤った方
                NSString *xmlStr = [[NSString new] initWithData:data
                                                         encoding:NSUTF8StringEncoding];
エラーログ
[__NSCFConstantString initWithBytes:length:encoding:]: unrecognized selector sent to instance 0x3ab93320

正しい方
                NSString *xmlStr = [[NSString alloc] initWithData:data
                                                         encoding:NSUTF8StringEncoding];

2014年6月7日土曜日

アプリ審査に関する雑記。

SSS Camという静音カメラアプリの審査リジェクトに関してちょいと不思議なことが。

最初は普通に審査リジェクトされていたんだけど、
(音が全く出ないのはダメってことで)
3回目の審査中にInReviewのまま、リジェクトされず審査チームから電話がかかってきた。

で珍しく個々の機能について、「これは駄目」「ここはこう変えて」と指摘された。
修正して再UPしてほしいとのこと。

うーむ、なんでいつも通り文面で返してこないのだろうか。
なにか文面にするとまずいのかと勘ぐってしまう。

2014年6月6日金曜日

起動直後に「Terminating app due to uncaught exception 'NSUnknownKeyException'」

アプリ起動直後に即死、
エラーメッセージは「Terminating app due to uncaught exception 'NSUnknownKeyException'」。

自分の場合の原因は、前回記事のコピペしたクラスに存在しないIBOutletをStoryBoardが参照していたため。

NSUnknownKeyExceptionって、「不明なキーで例外発生した(´・ω・`)」って意味だが分かりづらいな。
まあなんでも文字列キーで紐付けてるからそうっちゃそうだろけど。

2014年6月5日木曜日

ビルドエラー「linker command failed with exit code 1」

・・・何回おんなじビルドエラーでググっているんだ。
しかも前これブログ書いてないかいな。

類似のクラスを作成するため、ソースコード(.h、.m)をコピー。
リネームしてプロジェクトに追加。

で、ビルドするとエラー「linker command failed with exit code 1」。
なにやら、「duplicate symbol _contentsType 」と言われている。

要するに、元々のクラス内で適当に作成した変数がグローバルになってしまっていて、
バッティングしてしまったらしい。大量に。あほす。

新しく作った側の変数をリネームしまくって対応完了。


2014年6月4日水曜日

アプリ審査「Your app requires additional review time」だそうな

アプリの審査がIn Reviewになったまま、5日が経過。

審査完了(NGかもだが)メールがスパム扱いで拾えてないだけかと思ったがそんなこともなく。
そわそわしていたらメール来た。

"Your app requires additional review time"
 We are currently reviewing an app that you submitted for inclusion on the App Store, and want to let you know that the review process will require additional time. We apologize for the delay and will provide you with an update on the status of your app as soon as possible.

もうちょっとだけ続くんじゃみたいな話しか。
珍しい。課金でちょっと調子こいた値段にしてるからかな?

2014年6月3日火曜日

Git管理下からコピーして新しいプロジェクトを作成(svn export的な)

Git管理にあるフォルダを管理外してコピーする方法。
コピー新規で新しいプロジェクト作るのに使用。 
 
$ git checkout-index -a -f --prefix=export/
 
実行したフォルダにexportフォルダが作成され、中にコピーされる。 
好きにリネームして、またgit initで管理追加。
 
あと git archiveってすると固めた状態で出力できるみたい。
 
 
<参考>
gitでsvn export的なことをやる

2014年6月2日月曜日

ループ中でのreverseGeocodeLocationはできない模様


assetsを取得して中身全部なめて座標データから地名取得して配列にぶっこみたい。
で、実行すると全部ループ回りきったあとにreverseGeocodeLocationが一回だけ実行される。
(´・ω・`)

基本的にやりたかったことは以下↓

    for (ALAsset* asset in self.photos) {
        
        ALAssetRepresentation *representation = [asset defaultRepresentation];
        NSURL *url = [representation url];
        
        LOG_CURRENT_LINE(@"%@", url);
        
        CLLocation *location = (CLLocation *)[asset valueForProperty:ALAssetPropertyLocation];
        
        // 逆ジオコーディングの開始
        [_geocoder reverseGeocodeLocation:location
                        completionHandler:^(NSArray *placemarks, NSError *error) {
                          
                            LOG_CURRENT_LINE(@"ここがどう頑張っても先頭の一回しか実行されない");
                            
            if (error) {
                
                LOG_CURRENT_LINE(@"%@", error);
                
            } else {
                if (0 < [placemarks count]) {
                    
                    // ログ出力
                    LOG_CURRENT_LINE(@"%@", url);
                    CLPlacemark *p = [placemarks objectAtIndex:0];
                    
                    NSString *country = [p.addressDictionary objectForKey:@"Country"];
                    NSString *state = [p.addressDictionary objectForKey:@"State"];
                    
                    [_stateMuDic setObject:state
                                    forKey:state];
                    
                    LOG_CURRENT_LINE(@"%@", _stateMuDic);
                    
                }else{
                    
                    LOG_CURRENT_LINE(@"(取得できませんでした)");
                }
            }
        }];
        
        cnt++;
    }



途中にdispatch_semaphore_waitとか挟んでむりやり同期する方法もためしたけどうまくいかず。

でstackoverflowで調べてみたらやっぱ同じことしてる人いた。
reverseGeocodeLocation Only Executes Completion Block Once
→ (`・ω・´)短いスパンで呼び出してはダメってAppleのドキュメントにかいてあるよ

・・・だそうな。えええええぇぇぇぇぇぇぇ・・・・・。
げ、原文読むのしんどい。

2014年6月1日日曜日

Objective-Cにおける非同期処理についてちょいと調べた

まあ例によってまだ良くわかってないので調べ中なんですけど。
非同期処理を実装したい場合の方法について。
(厳密な用語として「非同期処理」と括っていいのかわからないけど、
「A処理の実行結果が取得された後にB処理を実行したい」というケース想定)

① dispatch_queueを使用する

dispatch_queue_createの第一引数は任意の文字列(const char)。
他の処理と重複してはいけないのかと最初思ったが、そうでもないようだ。

<参考>
http://fernweh.jp/b/grandcentraldispatch/
http://objective-audio.jp/2009/09/grand-central-dispatch-queue.html

dispatch_queue_t sub_queue = dispatch_queue_create("com.nadegiri.development", 0);
dispatch_async(sub_queue, ^{
    //実行したい処理
    [self hoge];
});

② NSNotificationを使用する

こっちの方がブロック構文とかなくて簡潔かなあ。

<参考>
http://qiita.com/EntreGulss/items/0fbfa1b75eebf075da4d


んで。
結局まだ問題解決してないんですけどね。
「ループ中で非同期処理を実行しても最初の一回しか実行されない」という。
やれやれ。難しいなあ・・・。