3

AFHTTPSessionManager GET:ディスパッチグループが待機するときにブロックを実行しません。 dispatch_group_waitは本当に "FOREVER"を待ちます。私のコードでは@「すべて完了」は決して起こらない。AFNetworking 3.1.0とディスパッチグループ

どうすればいいですか?

(申し訳ありませんが、ほとんどの人はここでディスパッチグループを使用する理由を知りたいのですが、その理由はループでリクエストを実行して最後のレスポンスを待つことです。ブロックが実行されていないことにループが影響しないためです)

dispatch_group_t group = dispatch_group_create(); 

NSString *urlString = @"someURLForExampleReturnJSON"; 
dispatch_group_enter(group); 
[self.sessionManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) 
{ 
    NSLog(@"success block execution"); 
    dispatch_group_leave(group); 
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
    NSLog(@"failure block execution"); 
    dispatch_group_leave(group); 
}]; 

dispatch_group_wait(group, DISPATCH_TIME_FOREVER); 
NSLog(@"all done"); 
+0

うーん、私はいけないが、私はdispatch_group' 'の使用はここにあるかを理解することはできませんよ、これはdispatch_groupは(特にこのような)のために意図されたものだと思う、あなたはおそらく代わりに – Fonix

+0

をdispatch_semaphoreを使用する必要があります?ここで必要なものを説明してください。なぜ 'dispatch_group'を使うのですか?あなたがdispatch_group_notify – CodeChanger

+0

。 dispatch_groupsを使用する理由を説明しなければならなかった – Andrea

答えて

1

最初に待機してメインスレッドをブロックする必要はありません。

実際の問題:デッドロックを作成しています。あなたはgroup.notifyを使用することができます。

のObj-C:

dispatch_group_notify(group, dispatch_get_main_queue(), ^{ 
    NSLog(@"all done"); 
}); 

スウィフト3:

group.notify(queue: DispatchQueue.main, execute: { 
    print("all Done") 
}) 

これは意味がありませんが、あなたは、ディスパッチグループなしで同じ結果をアーカイブすることができますとしてどのI非常にお勧めします:

[self.sessionManager GET:urlString parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) { 
    NSLog(@"all done"); 
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) { 
    NSLog(@"failure block execution"); 
}]; 

あなたが本当に待っている場合は、このACH:

import Foundation 

print("main start") 

let group = DispatchGroup() 
group.enter() 
// put your heavy task on background queue 
DispatchQueue.global(qos: .background).async { 
    print("background start") 
    sleep(2) // do some long running task 
    print("background stop") 
    group.leave() 
} 

// wait on main queue 
group.wait() 
print("go on") 
+0

を申し訳ありません使用した場合、より良い –

関連する問題