2011-01-06 27 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

首先,no,async()不保證塊的異步執行。這隻會發生,如果任何給定的塊被阻止等待發生。然後GCD將啓動另一個線程。

但是,如果系統已經相對加載,GCD將不會啓動一個新線程來做一些工作,如果工作已經在進行。

其次,沒有理由通過GCD將NSURLRequest推入背景。 NSURLRequest已經支持異步下載。

+0

NSURLConnection sendSynchronousRequest – Vjy 2011-01-06 22:04:11

相關問題