0

配列内の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;
  }
4

2 に答える 2

3

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

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

于 2011-01-29T14:28:00.237 に答える
1

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

ただし、システムがすでに比較的ロードされている場合、作業がすでに行われていると、GCDは新しいスレッドを起動して作業を行うことはありません。

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

于 2011-01-06T21:36:36.223 に答える