【问题标题】:Return bool when Grand Central Dispatch job queue finished当 Grand Central Dispatch 作业队列完成时返回 bool
【发布时间】:2013-01-16 23:06:29
【问题描述】:

我想在 dispatch_group_notify 完成后得到一个布尔值。 不幸的是,下面的代码是错误的,我不知道该怎么做...... 编译器告诉我“不兼容的块指针类型将'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;
});

}

【问题讨论】:

  • 为什么要让它返回一个布尔值?

标签: objective-c macos cocoa grand-central-dispatch


【解决方案1】:

首先,没有理由创建一个只调度单个块的新队列。将该块扔到现有的全局队列之一并完成它。

其次,您需要在该块的末尾执行以下操作:

 ....
 BOOL success = [moc save:nil];
 dispatch_async(dispatch_get_main_queue(), ^{
     if (success)
         [someObjectThatCares theSaveIsAllDoneThanksAndComeAgain];
     else
         [someObjectThatCares saveFailedGetOutAndDoNotComeBackUntilYouGetItRight];
 });

也就是说,不需要使用任何复杂的机制。只需在块的末尾添加一些代码,调用一些可以响应保存已完成的事实的方法。

【讨论】:

  • 好的,我认为最好的方法是将 BOOL 返回封装在我的异步过程中...谢谢您的有用回答。
【解决方案2】:

参数是一个返回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.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 2018-05-14
    • 2012-10-18
    • 2011-07-28
    • 2023-03-25
    相关资源
    最近更新 更多