Я новичок в асинхронных обратных вызовах и получил разные советы. Мне нужно выполнить асинхронные обратные вызовы, и после многих часов исследований я до сих пор не знаю, следует ли использовать блоки или GCD и очереди. Любые указатели приветствуются.Обратные вызовы синхронизации - блок против очереди GCD
OK. Так что я действительно спрашивал:
«для того, чтобы использовать« асинхронные »обратные вызовы, нужно ли использовать GCD и очереди?»
Что я собираю из ответов, так это то, что ответ ДА. Определенно GCD и очереди внутри блоки.
Моя путаница вытекает из того факта, что мне дали направление, что все, что мне было нужно, это блок, как код ниже:
[UIView animateWithDuration:.4f
animations:^{
flashView.alpha = 0.f;
}
completion:^(BOOL finished){
[flashView removeFromSuperview];
}
];
Но что я вижу в ответах здесь является то, что выше блок недостаточно для создания «асинхронных» обратных вызовов. Вместо этого я DO в-самом деле нужно использовать НОД и очереди внутри блока, как код ниже:
- (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];
});
}
Непонятно, что вы просите. GCD полностью построен вокруг идеи отправки блоков в очереди. Вы не можете отделить GCD от блоков и очередей, они идут вместе. –
@AndrewMadsen Технически вы * можете * использовать GCD с функциями, хотя кто захочет !? –
@ JasperBlues, да, я думал об этом. Я никогда не видел, чтобы кто-либо использовал эти функции отправки на основе функций. Я думаю, они полезны, если вы используете libdispatch в среде без блоков? Во всяком случае, для всех нормальных целей и целей, особенно для новичков, GCD всегда используется с блоками. –