performSelectorInBackground包含更多2个参数

时间:2015-10-01 11:54:43

标签: ios objective-c multithreading

我正在尝试使用对象和块执行performSelectorInBackground。 我知道this回答,但对我的案例没有帮助。之所以没有用,是因为答案是将2个参数作为对象传递,但在我的例子中是传递对象和回调。

这是我的代码:

static ACallBack aCallback;
- (void)doSometginh:(Book*)aBook callback:(ClassCallback)aCallback
{
    [self performSelectorInBackground:@selector(doVeryLongTask1:callback:) withObject:aPerson withObject:aCallback];
}

代码错误,因为它不接受第二个参数。 任何想法如何解析块作为第二个参数?

1 个答案:

答案 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来电,在主线程上添加最终回调。