ios - 为NSURLConnection委托保持一个线程活着

时间:2013-12-03 08:35:29

标签: ios objective-c cocoa

我想将一个块传递给NSOperationQueue以在后台线程上运行。

在块中我希望使用NSURLConnection来下载一个非常大的文件 - 使用异步,因为我想保存,因为我一直保证,如果网络丢弃/应用程序关闭,我不必重新加载整个文件等。

我想知道如何保持线程活动以服务委托回调。我需要设置NSRunLoop吗?

由于

3 个答案:

答案 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)

要下载大型文件,最好使用NSURLSessionNSURLSessionDownloadTask。请参阅此处的官方文档: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协议。