应该工作的是使用一个NSOperationQueue
实例,以及NSOperation
执行各种 URL 请求的多个实例。
首先,在类中设置一个队列,将请求排入队列。确保保持对它的强烈引用,即
@interface MyEnqueingClass ()
@property (nonatomic, strong) NSOperationQueue *operationQueue;
@end
在实现的某个地方,说init
方法:
_operationQueue = [[NSOperationQueue alloc] init];
_operationQueue.maxConcurrentOperationCount = 1;
你基本上想要一个串行队列,因此maxConcurrentOperationCount
是 1。
设置完成后,您将需要编写如下代码:
[self.operationQueue addOperationWithBlock:^{
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"my://URLString"]];
NSError *error;
NSURLResponse *response;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
if (!responseData)
{
//Maybe try this request again instead of completely restarting? Depends on your application.
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
//Do something here to handle the error - maybe you need to cancel all the enqueued operations and start again?
[self.operationQueue cancelAllOperations];
[self startOver];
}];
}
else
{
//Handle the success case;
}
}];
[self.operationQueue addOperationWithBlock:^{
//Make another request, according to the next instuctions?
}];
通过这种方式,您发送同步NSURLRequest
s 并可以处理错误情况,包括完全退出并重新开始(带有-cancelAllOperations
被调用的行)。这些请求将一个接一个地执行。
当然,您也可以编写自定义NSOperation
子类并将这些实例排入队列,而不是使用块,如果这对您有用的话。
希望这会有所帮助,如果您有任何问题,请告诉我!