0

这是我的情况:

- (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)')

如何解决?

4

2 回答 2

1

把你的条件放在主线程上,只在工作线程上做你持久的任务。否则,在工作线程上分派是没有意义的,因为您必须立即返回,textFieldShouldReturn这意味着您要么阻塞主线程,要么按照我上面的建议进行操作。

于 2013-07-16T07:33:50.287 回答
0

我认为您希望完成的事情不可能。至少不是这种形式。

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

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

编辑

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

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

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

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

听起来怎么样?它是否符合您想要的行为?

于 2013-07-16T07:20:49.870 回答