Dispatch_group_asyncを使用すると、ブロックが次々と解雇されます
-
30-09-2019 - |
質問
配列内のURLは次々と呼ばれます。 nsoperationQueueのように、一度にすべてと呼ばれるべきではありませんか?ここで私を助けてください、ありがとう
- (void) allTasksDone {
NSLog(@"DONE");
}
- (void) callMultiple {
dispatch_queue_t myQueue = dispatch_queue_create("com.mycompany.myqueue", 0);
dispatch_group_t group = dispatch_group_create();
NSArray *urls = [NSArray arrayWithObjects:
@"http://www.a.com",
@"http://www.b.com",
@"http://www.c.com",
nil];
for (NSString *url in urls) {
dispatch_group_async(group, myQueue, ^{
NSLog(url);
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
NSHTTPURLResponse *response = NULL;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
NSLog(@"COMPLETE");
});
}
dispatch_group_notify(group, myQueue, ^{
[self allTasksDone];
});
}
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[self callMultiple];
[self.window makeKeyAndVisible];
return YES;
}
解決
dispatch_queue_create FIFOキューを作成します。同じ順序テーマでキューから1つずつブロックが追加されました。ブロックを同時に実行したい場合は、ブロックごとに異なるキューを作成したり、グローバルキューの1つを使用したりできます。
dispatch_queue_t dispatch_get_global_queue(
long priority,
unsigned long flags);
優先度によって区別される3つのグローバルキューがあります。
enum {
DISPATCH_QUEUE_PRIORITY_HIGH = 2,
DISPATCH_QUEUE_PRIORITY_DEFAULT = 0,
DISPATCH_QUEUE_PRIORITY_LOW = -2,
};
これらのキューは、以前のブロックの完了を待っていません。そのため、ダウンロードは同時に実行されます。
他のヒント
第一に、いいえ、async()はブロックの非同期実行を保証しません。それは、何かが起こるのを待っている特定のブロックがブロックされている場合にのみ起こります。 GCDは別のスレッドをスピンアップします。
ただし、システムが既に比較的ロードされている場合、GCDはすでに作業が行われている場合、いくつかの作業を行うために新しいスレッドをスピンアップしません。
第二に、プッシュする理由はありません NSURLRequest
s GCDを介してバックグラウンドに入ります。 NsurlRequestは、非同期ダウンロードをすでにサポートしています。
所属していません StackOverflow