我正在与网络控制的硬件设备进行交互。您通过URL(例如,http://device/on?port=1
或http://device/off?port=3
)向其发送请求以打开和关闭内容,并发回“成功”或“失败”。然而,它是一个简单的设备,所以当它处理请求--- 即时,直到它返回它正在处理的请求的状态 - 它将忽略所有后续请求。它不排队;他们只是迷路了。
所以我需要发送串行,同步请求。 I.e。,req#1,等待响应#1,req#2,等待响应#2,req#3,等待响应#3等。
我是否需要管理自己的线程安全请求队列,让UI线程将请求推送到队列的一端,并让另一个线程一次一个地拉出请求,前一个请求要么完成要么超时,然后将结果发送回UI线程?或者我错过了已经执行此操作的API中的某些内容?
谢谢!
... [R
答案 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。