我想将一个块传递给NSOperationQueue以在后台线程上运行。
在块中我希望使用NSURLConnection来下载一个非常大的文件 - 使用异步,因为我想保存,因为我一直保证,如果网络丢弃/应用程序关闭,我不必重新加载整个文件等。
我想知道如何保持线程活动以服务委托回调。我需要设置NSRunLoop吗?
由于
答案 0 :(得分:1)
如果你想设置一个像AsiHttpRequest和AFNetworking网络库这样的长生命工作线程,答案是肯定的。
来自AFNetworking的工作线程的示例代码:
+ (void)networkRequestThreadEntryPoint:(id)__unused object {
@autoreleasepool {
[[NSThread currentThread] setName:@"AFNetworking"];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
[runLoop run];
}
}
答案 1 :(得分:0)
NSURLConnection委托已经在后台异步
中工作您可以在主线程中使用此方法
+ (NSURLConnection *)connectionWithRequest:(NSURLRequest *)request delegate:(id < NSURLConnectionDelegate >)delegate
或者如果您想在OperationQueue上运行它,只需使用
+ (void)sendAsynchronousRequest:(NSURLRequest *)request queue:(NSOperationQueue *)queue completionHandler:(void (^)(NSURLResponse*, NSData*, NSError*))handler
答案 2 :(得分:0)
要下载大型文件,最好使用NSURLSession
和NSURLSessionDownloadTask
。请参阅此处的官方文档:https://developer.apple.com/library/IOs/documentation/Foundation/Reference/NSURLSessionDownloadTask_class/Reference/Reference.html
如果你想使用NSURLConnection
,我建议实现委托(NSURLConnectionDataDelegate和NSURLConnectionDelegate)。在connection:didReceiveData:
委托中将每个数据块写入(追加)到文件中。
严格来说,您不需要后台线程来执行委托方法。保存到文件非常快。
您可以在此片段中查看,该片段使用委托方法实现基本的NSURLConnection,在主线程上运行:https://gist.github.com/couchdeveloper/5764723
实现可恢复下载实际上更复杂,并且需要熟悉HTTP协议。