ios - 排队 NSURLRequest 以模拟同步的阻塞请求
<p><p>我正在与网络控制的硬件设备进行交互。您通过 URL(<em>例如</em>、<code>http://device/on?port=1</code> 或 <code>http://device/off?port= 3</code>) 打开和关闭东西,它发回“成功”或“失败”。然而,它是一个简单的设备,所以在它处理请求时——<em>即</em>,直到它返回它正在处理的请求的状态——它将忽略所有后续请求。它不会将它们排队;他们只是迷路了。</p>
<p>所以我需要发送串行、同步的请求。 <em>即</em>,req#1,等待响应#1,req#2,等待响应#2,req#3,等待响应#3,等等。</p>
<p>我是否需要管理自己的线程安全请求队列,让 UI 线程将请求推送到队列的一端,并让另一个线程将请求拉出,一次一个,与前一个一样完成或超时,并将结果发送回 UI 线程?还是我在 API 中遗漏了一些已经做到这一点的东西?</p>
<p>谢谢!</p>
<p>...R</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>应该起作用的是使用一个 <code>NSOperationQueue</code> 实例,以及许多执行各种 URL 请求的 <code>NSOperation</code> 实例。</p>
<p>首先,在类中设置一个队列,将请求排入队列。确保强烈引用它,即</p>
<pre><code>@interface MyEnqueingClass ()
@property (nonatomic, strong) NSOperationQueue *operationQueue;
@end
</code></pre>
<p>在实现中的某个地方,比如 <code>init</code> 方法:</p>
<pre><code> _operationQueue = [ init];
_operationQueue.maxConcurrentOperationCount = 1;
</code></pre>
<p>您基本上需要一个串行队列,因此 <code>maxConcurrentOperationCount</code> 为 1。</p>
<p>设置完成后,您需要编写如下代码:</p>
<pre><code>[self.operationQueue addOperationWithBlock:^{
NSURLRequest *request = ];
NSError *error;
NSURLResponse *response;
NSData *responseData = ;
if (!responseData)
{
//Maybe try this request again instead of completely restarting? Depends on your application.
[ addOperationWithBlock:^{
//Do something here to handle the error - maybe you need to cancel all the enqueued operations and start again?
;
;
}];
}
else
{
//Handle the success case;
}
}];
[self.operationQueue addOperationWithBlock:^{
//Make another request, according to the next instuctions?
}];
</code></pre>
<p>通过这种方式,您发送同步的 <code>NSURLRequest</code> 并可以处理错误情况,包括完全退出并重新开始(调用 <code>-cancelAllOperations</code> 的行)。这些请求将一个接一个地执行。</p>
<p>您当然也可以编写自定义 <code>NSOperation</code> 子类并将这些子类的实例排入队列,而不是使用 block ,如果这对您有用的话。</p>
<p>希望对您有所帮助,如果您有任何问题,请告诉我!</p></p>
<p style="font-size: 20px;">关于ios - 排队 NSURLRequest 以模拟同步的阻塞请求,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/12147512/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/12147512/
</a>
</p>
页:
[1]