Asynchronous url requests inside dispatch_async

前端 未结 3 1539
悲&欢浪女
悲&欢浪女 2020-12-28 10:35

I am trying to implement asynchronous url requests in a particular function, I want all these requests to complete and then do a particular action but the action precedes th

相关标签:
3条回答
  • 2020-12-28 11:32

    @tkanzakic is on the right path. The correct construct to use is the dispatch_group_t. But the implementation could be improved. By using a semaphore you can launch all your downloads asynchronously and still make sure that you don't have too many running concurrently. Here is a code sample that illustrates how you should use dispatch_group_t as well as make all your downloads parallel:

    dispatch_queue_t fetchQ = dispatch_queue_create("Featured Doc Downloader", NULL);
    dispatch_group_t fetchGroup = dispatch_group_create();
    
    // This will allow up to 8 parallel downloads.
    dispatch_semaphore_t downloadSema = dispatch_semaphore_create(8);
    
    // We start ALL our downloads in parallel throttled by the above semaphore.
    for (int i=0; i<count; i++) {
        dispatch_group_async(fetchGroup, fetchQ, ^(void) {
            dispatch_semaphore_wait(downloadSema, DISPATCH_TIME_FOREVER);
            NSURLConnection *loginConnection = [[NSURLConnection alloc] initWithRequest:requestArray[i] delegate:self];
            dispatch_semaphore_signal(downloadSema);
        });
    }
    
    // Now we wait until ALL our dispatch_group_async are finished.
    dispatch_group_wait(fetchGroup, DISPATCH_TIME_FOREVER);
    
    // Update your UI
    dispatch_sync(dispatch_get_main_queue(), ^{
        [self updateUIFunction];
    });
    
    // Release resources
    dispatch_release(fetchGroup);
    dispatch_release(downloadSema);
    dispatch_release(fetchQ);
    
    0 讨论(0)
  • 2020-12-28 11:37

    First Configure run loop.

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSURLRequest* request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
        [NSURLConnection connectionWithRequest:request delegate:self];
        while(!self.finished) {
            [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
        }
    });
    

    Try this

    0 讨论(0)
  • 2020-12-28 11:42

    You can create a dispatch_group_t and then use dispatch_group_notify to execute the updateUIFunction when the previous block of the group finish running, for example:

    dispatch_queue_t fetchQ = dispatch_queue_create("Featured Doc Downloader", NULL);
    dispatch_async(fetchQ, ^{
        dispatch_group_t group = dispatch_group_create();
        dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
            [self myAsyncMultipleURLRequestFunction];
        });
        dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
            dispatch_async(dispatch_get_main_queue(), ^{
                [self updateUIFunction];
            });
        });
    });
    
    0 讨论(0)
提交回复
热议问题