我是异步回调的新手,并且得到了不同的建议。我需要执行异步回调,经过数小时的研究,我仍然不知道我应该使用块还是 GCD 和队列。欢迎任何指点。
好的。所以我真正要问的是:
“为了使用‘异步’回调,我需要使用 GCD 和队列吗?”
我从答案中收集到的是答案是YES。绝对是GCD和blocks内的队列。
我的困惑源于这样一个事实,即我得到了我所需要的只是一个块的方向,如下面的代码:
[UIView animateWithDuration:.4f
animations:^{
flashView.alpha = 0.f;
}
completion:^(BOOL finished){
[flashView removeFromSuperview];
}
];
但是我在这里的答案中看到的是,上面的块不足以进行“异步”回调。相反,我实际上需要在block中使用GCD和队列,如下面的代码:
- (void)invokeAsync:(id (^)(void))asyncBlock resultBlock:(void (^)(id))resultBlock errorBlock:(void (^)(id))errorBlock {
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id result = nil;
id error = nil;
@try {
result = asyncBlock();
} @catch (NSException *exception) {
NSLog(@"caught exception: %@", exception);
error = exception;
}
// tell the main thread
dispatch_async(dispatch_get_main_queue(), ^{
NSAutoreleasePool *secondaryPool = [[NSAutoreleasePool alloc] init];
if (error != nil) {
errorBlock(error);
} else {
resultBlock(result);
}
[secondaryPool release];
});
[pool release];
});
}