ブロックを使ったObjectiveCプログラミングについて少し混乱しています。
たとえば、次の方法があります。
.hで
- (void)downloadDataWithURLString:(NSString *)urlString
completionHandler:(void(^) (NSArray * response, NSError *error))completionHandler;
.mで:
- (void)downloadedDataURLString:(NSString *)urlString
completionHandler:(void (^)(NSArray *, NSError *))completionHandler {
// some things get done here. But what!?
}
私の主な質問は....この完了ハンドラーを実装するにはどうすればよいですか?配列とエラーで返される変数は何ですか?これはコードの1つの領域ですが、完了したときに何をすべきかをどのように指示すればよいですか?
メソッド(ブロックの本体)によって実行されるコードを提供するのは、呼び出し元の責任です。そのコードを呼び出すのは実装者次第です。
簡単な例から始めるために、呼び出し元がurlStringを使用して配列を形成し、コールバックすることを望んでいたとすると、次のようになります。
- (void)downloadedDataURLString:(NSString *)urlString
completionHandler:(void (^)(NSArray *, NSError *))completionHandler {
NSArray *callBackWithThis = @[urlString, @"Look ma, no hands"];
completionHandler(callBackWithThis, nil);
}
発信者はこれを行います:
- (void)someMethodInTheSameClass {
// make an array
[self downloadedDataURLString:@"put me in an array"
completionHandler:^(NSArray *array, NSError *error) {
NSLog(@"called back with %@", array);
}];
}
呼び出し元は、@ "put me in aarray"と@ "Look ma、nohands"を使用して2項目の配列をログに記録します。より現実的な例では、何かのダウンロードが終了したときに誰かが電話をかけ直すように頼んだとします。
- (void)downloadedDataURLString:(NSString *)urlString
completionHandler:(void (^)(NSArray *, NSError *))completionHandler {
// imagine your caller wants you to do a GET from a web api
// stripped down, that would look like this
// build a request
NSURL *url = [NSURL URLWithString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// run it asynch
[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {
if (!error) {
// imagine that the api answers a JSON array. parse it
NSError *parseError;
id parse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&parseError];
// here's the part you care about: the completionHandler can be called like a function. the code the caller supplies will be run
if (!parseError) {
completionHandler(parse, nil);
} else {
NSLog(@"json parse error, error is %@", parseError);
completionHandler(nil, parseError);
}
} else {
NSLog(@"error making request %@", error);
completionHandler(nil, error);
}
}];
// remember, this launches the request and returns right away
// you are calling the block later, after the request has finished
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加