我正在尝试使用对象和块执行performSelectorInBackground。 我知道this回答,但对我的案例没有帮助。之所以没有用,是因为答案是将2个参数作为对象传递,但在我的例子中是传递对象和回调。
这是我的代码:
static ACallBack aCallback;
- (void)doSometginh:(Book*)aBook callback:(ClassCallback)aCallback
{
[self performSelectorInBackground:@selector(doVeryLongTask1:callback:) withObject:aPerson withObject:aCallback];
}
代码错误,因为它不接受第二个参数。 任何想法如何解析块作为第二个参数?
答案 0 :(得分:4)
为什么不使用Grand Central Dispatch
?
你可以这样做:
static TestClassCallback savedCallback;
- (void)doSometginh:(Book*)aBook callback:(ClassCallback)aCallback {
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
[self doVeryLongTask1:aPerson callback:aCallback];
});
}
您可以使用以下代码在主线程中执行回调:
dispatch_async(dispatch_get_main_queue(), ^(void){
callback();
});
修改强> 这些调用可以嵌套。 例如,如果您想让Task1和Task2在后台运行,并且您想要在它们之间的主线程上更新某些内容:
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
// Task 1
dispatch_async(dispatch_get_main_queue(), ^(void){
// Update on main thread
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void){
// Task 2
});
});
});
在dispatch_async(dispatch_get_main_queue(), ^(void){
之后添加另一个// Task 2
来电,在主线程上添加最终回调。