2011-01-06 2 views
0

配列内のURLが順番に呼び出されます。 nisperationqueueのように、一度にすべて呼び出されてはいけませんか?ありがとうございます。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キューを作成します。同じオーダーのテーマのキューから1つずつブロックが追加されました。ブロックを並行して実行する場合は、ブロックごとに異なるキューを作成するか、グローバルキューのいずれかを使用できます。

dispatch_queue_t dispatch_get_global_queue(
    long priority, 
    unsigned long flags); 

グローバルキューは3つあり、優先度によって区別されます。

これらのキューは、前のブロック完了を待機しません。あなたのダウンロードは同時に実行されます。

1

まず、async()はブロックの非同期実行を保証しません。それは、ブロックがブロックされて何かが起こるのを待っている場合にのみ発生します。 GCDは別のスレッドをスピンアップします。

しかし、すでにシステムが比較的ロードされている場合、GCDは作業が既に行われている場合に新しいスレッドをスピンアップして作業をしません。

第2に、NSURLRequestをGCD経由でバックグラウンドにプッシュする理由はありません。 NSURLRequestはすでに非同期ダウンロードをサポートしています。

+0

NSURLConnection sendSynchronousRequest – Vjy

+0

NSURLRequest非同期操作はすべてメインスレッドで行われます。 –

関連する問題