

AppleWatchからiPhoneにリクエストを投げるのに、  
[WKInterfaceController openParentApplication:userInfo reply: **^(NSDictonary
*replyInfo, NSError *error)** {  
if(replyInfor){  
・・・

とありますが、  
**^(NSDictonary *replyInfo, NSError *error)**  
は何をやっているのでしょうか？

またiPhoneでのAppleWatchのリクエスト受信で、  
-(void)application:(UIApplication *)application handleWatchKitExtensionRequest:(NSDictionary *)userInfo reply: **(void (^)(NSDictionary *))reply** {  
・・・  
の**(void (^)(NSDictionary *))reply**も何をやっているのかわかりません。  
「^」がそもそもわからないからなのでしょうか。。

参考になるURLでもかまいません。どなたか教えてください。


CC BY-SA 3.0
2015-06-12T15:18:50.280
11295
2015-06-12T22:51:07.847
8593
question
ios objective-c
WKInterfaceControlerのメソッドで何を行っているか？


`^`で始まる記法はブロックといって、他の言語ではクロージャとか無名関数などと呼ばれているものですが、大ざっぱにいうと処理をオブジェクトとして変数に格納したり、引数として渡せるという言語の機能です。

<https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW2>

↑上記の公式のドキュメントの他、「Objective-C ブロック」などの検索後で調べると良いです。

さて、

[code]

    reply:^(NSDictonary *replyInfo, NSError *error)
    
[/code]

の部分は`reply`という名前で、`NSDictonary`と`NSError`の２つの引数をとるブロックを引数として渡している、ということになります。

Cocoaでは、ブロックは主に非同期のメソッドのコールバックとして利用されることが多く、このメソッドでもそのように使われています。

この`reply`に渡したブロック（処理の固まり）はアプリの呼び出しが完了したときにシステムから呼び出されます。  
そうすることによって、非同期のメソッドの実行が完了したことを知らせることができるようになっています。

呼び出されるアプリのほうでは、下記のデリゲートメソッドが呼び出されますので、

[code]

    - (void)application:(UIApplication *)application
    handleWatchKitExtensionRequest:(NSDictionary *)userInfo
                             reply:(void(^)(NSDictionary *replyInfo))reply;
    
[/code]

例えば次のように、アプリケーション側から必要な情報を`NSDictionary`に詰めてブロックを呼び出すことで、Watch側に完了を知らせる（と同時に情報を渡す）ことができます。

[code]

    - (void)application:(UIApplication *)application
    handleWatchKitExtensionRequest:(NSDictionary *)userInfo
                             reply:(void(^)(NSDictionary *replyInfo))reply
        // 適当に何かする...
    
        NSDictionary *replyInfo = @{@"aaa": @"bbb"};
        reply(replyInfo); // 必要な処理が終わったらコールバックとしてブロックを呼び出す
    }
    
[/code]

するとWatch側では引数として渡したブロックが呼び出されますので、そこで完了を知ることができ、必要ならあらかじめブロックとして渡した処理が実行されます。

[code]

    [WKInterfaceController openParentApplication:nil reply:^(NSDictionary *replyInfo, NSError *error) {
        // アプリ側の呼び出しが完了したらこのブロックが呼び出される
        NSLog(@"%@", replyInfo); // {"aaa": "bbb"}
    }];
    
[/code]


CC BY-SA 3.0
2015-06-12T22:51:07.847
11301
2015-06-12T22:51:07.847
5519
11295
answer