2011-01-06 1 views
0

URL-адреса в массиве называются один за другим. Разве это нельзя назвать всем сразу, как nsoperationqueue? Пожалуйста, помогите мне здесь, спасибоБлоки запускаются один за другим при использовании dispatch_group_async

- (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; 
    } 

ответ

3

dispatch_queue_create создает очередь FIFO. Он добавляет блоки по очереди из очереди в том же порядке. Если вы хотите одновременно выполнять блоки, вы можете создавать разные очереди для каждого блока или использовать одну из глобальных очередей.

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, 
}; 

Эти очереди не ждут завершения предыдущего блока. Таким образом, ваши загрузки будут выполняться одновременно.

1

Во-первых, нет, async() не гарантирует асинхронное выполнение блоков. Это произойдет только в том случае, если какой-либо блок заблокирован, ожидая чего-то. Затем GCD перекрутит еще один поток.

Однако, если система уже относительно загружена, GCD не собирается разворачивать новый поток, чтобы выполнить некоторую работу, если работа уже происходит.

Во-вторых, нет причин для толкания NSURLRequest s на задний план через GCD. NSURLRequest поддерживает асинхронные загрузки уже.

+0

NSURLConnection sendSynchronousRequest – Vjy

+0

Но NSKLRequest асинхронные операции происходят в основном потоке, верно? –