以下是我的案例:
- (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)')
如何解决?
答案 0 :(得分:1)
将您的条件放在主线程上,只在工作线程上执行持久的任务。否则,在工作线程上调度是没有意义的,因为你必须立即从textFieldShouldReturn
返回,这意味着你要么阻止主线程,要么像我上面建议的那样。
答案 1 :(得分:0)
我认为你想要完成的事情是不可能的。至少不是这种形式。
也许您可以告诉我们您尝试完成的更多信息,我们可以提供替代解决方案。
我很好奇你为什么要在textFieldShouldReturn:
中执行一个长期任务,该任务应该立即返回一个值。你异步执行它并不重要,文本字段在那一刻需要一个值。
修改强>
好的,我知道你必须在coredata进行长时间的搜索。不幸的是textFieldShouldReturn:
需要返回值。
textFieldShouldReturn:
只是一种委托方法,允许您在按Return键时实现自定义行为。最常见的是,开发人员隐藏了键盘。
我的猜测是你在决定是否隐藏键盘之前在coredata进行搜索。在这种情况下,我会
所以,在textFieldShouldReturn:
中,我建议您隐藏键盘并以某种方式锁定该键盘以防止编辑。从该方法,您还可以触发coredata搜索异步。当您收到回复时,您可以决定是再次开始编辑该文本字段(显示键盘)还是继续前进。
听起来怎么样?它符合您的期望行为吗?