返回GCD块内的指针

时间:2013-07-16 07:13:30

标签: ios grand-central-dispatch

以下是我的案例:

- (BOOL)textFieldShouldReturn:(UITextField *)textField{

        dispatch_async(backgroundQueue, ^{
         //Do long-running tasks
        if(/*some condition*/){
             //Continue long-running tasks
                    dispatch_async(dispatch_get_main_queue(), ^{
             //UIKit stuff
            });
        return NO;
        }else{
             //Continue long-running tasks

              dispatch_async(dispatch_get_main_queue(), ^{
             //UIKit stuff
            });
         return YES;
}
});
}

由于块是void返回类型,我得到了这个编译错误:

Incompatible block pointer types passing 'BOOL(^)(void)' to parameter of type 'dispatch_block_t' (aka 'void(^)(void)')

如何解决?

2 个答案:

答案 0 :(得分:1)

将您的条件放在主线程上,只在工作线程上执行持久的任务。否则,在工作线程上调度是没有意义的,因为你必须立即从textFieldShouldReturn返回,这意味着你要么阻止主线程,要么像我上面建议的那样。

答案 1 :(得分:0)

我认为你想要完成的事情是不可能的。至少不是这种形式。

也许您可以告诉我们您尝试完成的更多信息,我们可以提供替代解决方案。

我很好奇你为什么要在textFieldShouldReturn:中执行一个长期任务,该任务应该立即返回一个值。你异步执行它并不重要,文本字段在那一刻需要一个值。

修改

好的,我知道你必须在coredata进行长时间的搜索。不幸的是textFieldShouldReturn:需要返回值。

textFieldShouldReturn:只是一种委托方法,允许您在按Return键时实现自定义行为。最常见的是,开发人员隐藏了键盘。

我的猜测是你在决定是否隐藏键盘之前在coredata进行搜索。在这种情况下,我会

所以,在textFieldShouldReturn:中,我建议您隐藏键盘并以某种方式锁定该键盘以防止编辑。从该方法,您还可以触发coredata搜索异步。当您收到回复时,您可以决定是再次开始编辑该文本字段(显示键盘)还是继续前进。

听起来怎么样?它符合您的期望行为吗?