排队NSURLRequest以模拟同步阻塞请求

时间:2012-08-27 18:31:15

标签: ios multithreading queue nsurlrequest

我正在与网络控制的硬件设备进行交互。您通过URL(例如http://device/on?port=1http://device/off?port=3)向其发送请求以打开和关闭内容,并发回“成功”或“失败”。然而,它是一个简单的设备,所以当它处理请求--- 时,直到它返回它正在处理的请求的状态 - 它将忽略所有后续请求。它不排队;他们只是迷路了。

所以我需要发送串行,同步请求。 I.e。,req#1,等待响应#1,req#2,等待响应#2,req#3,等待响应#3等。

我是否需要管理自己的线程安全请求队列,让UI线程将请求推送到队列的一端,并让另一个线程一次一个地拉出请求,前一个请求要么完成要么超时,然后将结果发送回UI线程?或者我错过了已经执行此操作的API中的某些内容?

谢谢!

... [R

2 个答案:

答案 0 :(得分:2)

应该使用NSOperationQueue实例以及执行各种URL请求的多个NSOperation实例。

首先,在将要排队请求的类中设置一个队列。确保对它有强烈的引用,即

@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并且可以处理错误情况,包括完全拯救并从头开始(调用-cancelAllOperations的行)。这些请求将一个接一个地执行。

当然,您也可以编写自定义NSOperation子类并将这些子类的实例排入队列,而不是使用块,如果这样可以为您服务。

希望这有帮助,如果您有任何问题,请与我联系!

答案 1 :(得分:0)

您可以使用NSOperationQueue class并使用内置的一些API,例如AFNetworking