我想在dispatch_group_notify完成后得到一个bool值。 不幸的是,以下代码是错误的,我不知道如何做到这一点...... Compilator告诉我“不兼容的块指针类型将'BOOL'(^)(void)'传递给'dispatch_block_t'类型的参数(又名'void(^)(void ^))” 有什么想法吗?
-(BOOL)saveToDB:(NSArray*)data{
// execute async the saveJSONDictionary
__block BOOL toReturn;
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_queue_create("saveJsonDictionary", 0);
dispatch_group_async(group, queue, ^{
for (int i = 0; i < [data count]; ++i) {
NSDictionary* item = (NSDictionary*)[data objectAtIndex:i];
[self saveJsonDictionary:item];
}
NSManagedObjectContext *moc = [[DatabaseManager sharedManager]managedObjectContext];
toReturn = [moc save:nil];
});
dispatch_group_notify(group, queue, ^BOOL{
return toReturn;
});
}
答案 0 :(得分:4)
首先,没有理由创建一个新队列来仅调度一个块。将该块放到现有的全局队列之一上并完成它。
其次,你会想要在那个块的末尾做这样的事情:
....
BOOL success = [moc save:nil];
dispatch_async(dispatch_get_main_queue(), ^{
if (success)
[someObjectThatCares theSaveIsAllDoneThanksAndComeAgain];
else
[someObjectThatCares saveFailedGetOutAndDoNotComeBackUntilYouGetItRight];
});
也就是说,不需要使用任何复杂的机制。只需在块的末尾添加一些代码,调用一些可以响应保存已完成的方法。
答案 1 :(得分:0)
该参数是一个返回void并且不接受任何参数的块,您不能强制它成为另一种类型的参数。您必须手动实现一种机制来获取返回值。例如:
dispatch_group_notify(group, queue, ^
{
[self performSelectorOnMainThread: @selector(notifyValue:) withObject: @(trueOrFalse) waitUntilDone: NO];
});
方法:
- (void) notifyValue: (NSNumber*) value
{
// You got the "virtual" return value of that method, you can use it.
}