2015-03-12 3 views
0

Как выполнить число NSURLConnection sendAsynchronousRequest на заказ?Выполнение номера NSURLConnection sendAsynchronousRequest «по порядку» после завершения каждого запроса

Я должен выполнить различные запросы async и получить ЗАКЛЮЧИТЕЛЬНЫЙ ЗАВЕРШЕНИЕ.

Я хотел выполнить эти действия в определенном порядке. Позволяет сказать

sendAsynchronousRequest2 должны быть начаты после завершения sendAsynchronousRequest1 и так далее ... Ответ

ɲeuroburɳ в этом вопросе полезно. Но это не решает мою проблему

Waiting until two async blocks are executed before starting another block

Помощь будут оценены

ответ

1

НОД Семафор может помочь вам.

dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
     // some operations 
     dispatch_semaphore_signal(semaphore); 
    }); 

    // You will reach this point only after signal 
    dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC)); 

    // for more you just add one more async dispatch 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0),^{ 
     // some operations 
     dispatch_semaphore_signal(semaphore); 
    }); 
    dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, 5 * NSEC_PER_SEC)); 

В этом случае вы будете выбирать сам, когда блок заканчивается, и когда вам нужно идти дальше

Также вы можете использовать NSOperationQueue (NSOperation Dependency) или НОД группы

Подробнее о семафорах чтения здесь - https://developer.apple.com/library/prerelease/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/index.html#//apple_ref/doc/uid/TP40008079-CH2-SW37

+0

К сожалению, как это сделать с более чем одним 'dispatch_async' И что окончательное завершение? – riyaz

2

Я сделал что-то подобное раньше. Я использовал пользовательский объект, который содержал экземпляр NSURLRequest и стиль NSURLConnection completionHandler. Эти объекты были созданы и добавлены в очередь.
Вспомогательный метод отменяет запрос и отправляет его. В исходном завершении Handler NSURLConnection я вызвал завершение Handler для настраиваемого объекта, а затем снова вызвал вспомогательный метод. Затем будет отменен следующий запрос.

В коде, который будет выглядеть следующим образом:

@interface URLRequest: NSObject 
@property (strong, nonatomic) NSURLRequest *request; 
@property (copy, nonatomic) void (^completionHandler)(NSURLResponse *response, NSData *data, NSError *connectionError); 
@end 

@implementation URLRequest 
@end 

 

// viewController Interface 
@property (strong) NSMutableArray *requestsQueue; 

// implementation 
- (BOOL)sendURLRequest { 
    if ([self.requestsQueue count] > 0) { 
     URLRequest *request = self.requestsQueue[0]; 
     [NSURLConnection sendAsynchronousRequest:request.request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
      NSLog(@"Request to url %@ done", response.URL); 

      if (request.completionHandler) { 
       request.completionHandler(response, data, connectionError); 
      } 
      [self.requestsQueue removeObjectAtIndex:0]; 

      if (![self sendURLRequest]) { 
       NSLog(@"Queue Completed"); 
      } 
     }]; 
     return YES; 
    } 
    else { 
     NSLog(@"All requests send"); 
     return NO; 
    } 
} 

- (void)addRequestToQueue:(URLRequest *)request { 
    if (!self.requestsQueue) { 
     self.requestsQueue = [NSMutableArray array]; 
    } 
    BOOL queueWasEmpty = [self.requestsQueue count] == 0; 
    [self.requestsQueue addObject:request]; 

    if (queueWasEmpty) { 
     NSLog(@"Start request queue"); 
     [self sendURLRequest]; 
    } 
} 

 

URLRequest *request = [[URLRequest alloc] init]; 
request.request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.google.com"]]; 
request.completionHandler = ^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
    NSLog(@"Request to www.google.com completed with status %ld", (long)((NSHTTPURLResponse *)response).statusCode); 
}; 
[self addRequestToQueue:request]; 

request = [[URLRequest alloc] init]; 
request.request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.stackoverflow.com"]]; 
request.completionHandler = ^(NSURLResponse *response, NSData *data, NSError *connectionError) { 
    NSLog(@"Request to www.stackoverflow.com completed with status %ld", (long)((NSHTTPURLResponse *)response).statusCode); 
}; 
[self addRequestToQueue:request]; 

Это наивная версия. Вы должны думать об ошибке (и тайм-ауте) самостоятельно.

2

Вы можете сделать что-то похожее на следующее.

Добавьте свои NSURLRequests в NSMutableArray в том порядке, в котором вы хотите их завершить.

Затем вызовите «performRequestQueue», чтобы запустить их в следующем порядке:

NSMutableArray *requests = ... 

- (void)performRequestQueue { 
    NSURLRequest *request = [requests firstObject]; 
    NSOperationQueue *rQueue = [[NSOperationQueue alloc] init]; 
    [NSURLConnection sendAsynchronousRequest:request queue:rQueue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) { 
     if ([data length] && error == nil) { 
      // use data 

      // remove current request from queue 
      [requests removeObject:[requests firstObject]]; 
      if (requests.count > 0) { 
       // if there are more, start next request 
       [self performRequestQueue] 
      } else { 
       // else queue is complete, do whatever you need to here 
       [self queueCompleted]; 
      } 
     } else { 
      // no data or error 
     } 
    }]; 
} 

- (void)queueCompleted { 
    // All NSURLConnections completed 
} 
Смежные вопросы