我正在尝试理解完成处理程序和块。我相信你可以使用块来进行许多深入的编程,而不需要完成处理程序,但我认为完成处理程序是基于块的。 (因此基本上完成处理程序需要块,但反之则不然)。
所以我在互联网上看到了这段关于旧Twitter框架的代码:
[twitterFeed performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) {
if (!error) {
self.successLabel.text = @"Tweeted Successfully";
[self playTweetSound];
} else {
// Show alert
}
// Stop indicator
sharedApplication.networkActivityIndicatorVisible = NO;
}];
在这里,我们调用了一个执行某些操作(执行TWRequest)并在完成时返回responseData、urlResponse和error的方法。只有在它返回时,才会执行测试granted并停止活动指示器的块。完美!
现在,这是我为另一个应用程序设置的方式,它可以正常工作,但我正在努力把所有的部分组合起来:
@interface
Define an ivar
typedef void (^Handler)(NSArray *users);
Declare the method
+(void)fetchUsersWithCompletionHandler:(Handler)handler;
@implementation
+(void)fetchUsersWithCompletionHandler:(Handler)handler {
//...Code to create NSURLRequest omitted...
__block NSArray *usersArray = [[NSArray alloc] init];
//A. Executes the request
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
// Peform the request
NSURLResponse *response;
NSError *error = nil;
NSData *receivedData = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response
error:&error];
// Deal with your error
if (error) {
}
NSLog(@"Error %@", error);
return;
}
// Else deal with data
NSString *responseString = [[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];
usersArray = [NSJSONSerialization JSONObjectWithData:[responseString dataUsingEncoding:NSASCIIStringEncoding] options:0 error:nil];
// Checks for handler & returns usersArray to main thread - but where does handler come from & how does it know to wait tip usersArray is populated?
if (handler){
dispatch_sync(dispatch_get_main_queue(), ^{
handler(usersArray);
});
}
});
}
以下是我的理解:
- fetchUsersWithCompletionHandler 显然是 performRequestWithHandler 的类似物
- 不幸的是,这更加复杂了,因为其中有一次 GCD 调用...
但基本上,请求被执行并处理错误和数据,然后检查处理程序。我的问题是,这个处理程序部分是如何工作的?如果存在,它会将用户数组发送回主队列并返回。但是它如何知道等待 usersArray 被填充?我想混淆我的是该方法:block 在此情况下具有另一个块,即 dispatch_async 调用。我想我要找的是实际执行操作并知道何时返回 responseData 和 urlResponse 的逻辑。我知道这不是同一个应用程序,但我看不到 performRequestWithHandler 的代码。
NSData
转换为NSString
,然后再转换回NSData
的必要性是什么? - Rishab