1

dispatch_group_notify が終了した後に bool 値を取得したいと思います。残念ながら、次のコードは間違っており、その方法がわかりません...コンパイラは、「'BOOL'(^)(void)' をタイプ 'dispatch_block_t'(aka ' 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;
});

}

4

2 に答える 2

5

まず、1 つのブロックのみをディスパッチするために新しいキューを作成する理由はありません。そのブロックを既存のグローバル キューの 1 つに投げて、処理を完了します。

第二に、そのブロックの最後で次のようなことをしたいと思うでしょう:

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

つまり、複雑なメカニズムを使用する必要はありません。保存が完了したという事実に応答できるメソッドを呼び出すコードをブロックの最後に少し追加するだけです。

于 2013-01-16T23:28:06.697 に答える
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.
}
于 2013-01-16T23:25:50.423 に答える