我在SO内搜索了很多,但我找不到正确的答案。 这里的问题是:
我正在找出在NSOperation
子类中发送多个上传请求的正确机制。特别是,该类在其main
方法中执行两种不同的操作:
因为,这两个操作可能需要一段时间才能执行,我已经如上所述将它们包裹在NSOperation
内。
要上传数据我决定采用同步模式(我需要将我的应用程序与已成功提交到Web服务器的上传请求数同步)。
为了执行类似的上传,我正在以如下的同步方式使用ASIHttpRequest。
for (int i = 0; i < numberOfUploads; i++) {
// 1-grab data here...
// 2-send data here
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
int response = [request responseStatusCode];
if(response == 200)
uploads++;
}
}
所以,我的问题是:
ASIHTTPRequest *request
是否有效? 注意我正在使用ASIHttpRequest进行同步请求,但我认为可以通过NSUrlConnection
类通过
sendSynchronousRequest:returningResponse:error:
提前谢谢。
答案 0 :(得分:2)
直接回答您的问题:
是的,使用同步调用调用NSUrlConnection
(在您的情况下,ASI包装器)在NSOperation
中有效。
您可以在后台主题中创建NSUrlConnections
,但这里有几点要记住:
如果在后台线程上使用它,则必须调用同步方法,或者必须自己保持线程处于活动状态。在async
中使用NSOperation
可以很好地解释:How do I do an Asychronous NSURLConnection inside an NSOperation?我使用了这种模式并且效果很好。
NSUrlConnnection
委托回调回调创建NSUrlConnection
的线程。只需记住一些事情。
您不必使用async
模式,但可以。异步模式提供了更大的灵活性。例如,如果您需要取消操作,则可以使用NSUrlConnection
模式取消async
请求。使用同步模式,您将被迫让它运行(除非您明确地终止该线程)。
一个注意事项:我会重新考虑使用ASI,因为它不再受支持。 AFNetworking
似乎是最受欢迎的替代品,但我选择直接使用NSUrlConnection
。
答案 1 :(得分:1)
每当你想在后台线程中使用ASIHTTPRequest
进行呼叫时,你必须只调用同步呼叫,因为线程会在发送请求后立即关闭请求,以及你的问题
1,这是有效的解决方案,但仅使用同步调用
2.您可以在后台线程中调用ASIHTTPRequest
,也可以使用
nsurlconnection sendSynchronousRequest:returningResponse:error:
async
模式不适用于后台线程,只能在主线程上使用它们。