Блоки уволены один за другим при использовании dispatch_group_async
-
30-09-2019 - |
Вопрос
URL в массиве называются один за другим. Должна ли это не назвать все одновременно, как nsopurationceue? Пожалуйста, помогите мне здесь, спасибо
- (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 создает очередь ФИФО. Он принимает блоки один за другим из очереди в той же теме по порядку. Если вы хотите выполнить блоки одновременно, вы можете создавать разные очереди для каждого блока или получать использование одной из глобальных очередей.
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 поддерживает асинхронные загрузки уже.