我在一个单独的线程上运行NSURLConnection(我知道它是异步的并且在主线程上运行时有效),但即使我将父线程作为委托传递,它也不会进行委托调用。有谁知道怎么做?
代码:
-(void)startConnectionWithUrlPath:(NSString*)URLpath {
//initiates the download connection - setup
NSURL *myURL = [[NSURL alloc] initWithString:URLpath];
myURLRequest = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
[myURL release];
//initiates the download connection on a seperate thread
[NSThread detachNewThreadSelector:@selector(startDownloading:) toTarget:self withObject:self];
}
-(void)startDownloading:(id)parentThread {
NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init];
[NSURLConnection connectionWithRequest:myURLRequest delegate:parentThread];
//The delegate methods are setup in the rest of the class but they are never getting called...
[pool drain];
}
修改 的 *
我需要在一个单独的线程上运行NSURLConnection的原因是因为我在我的iPhone应用程序中下载了一些东西,并且当用户锁定屏幕时下载取消(如果用户只需按下主页按钮并且应用程序进行,则继续下载进入背景)。我理解这是因为我在主线程上异步运行连接,而不是单独的。
我在启动NSURLConnection时也尝试过这段代码(不是在一个单独的线程中):
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:myURLRequest delegate:self startImmediately:NO];
[connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[connection start];
[connection release];
但是我在屏幕锁定上取消下载时遇到了同样的问题。
*的更新
在下面添加托马斯的回答(请注意,詹姆斯韦伯斯特的答案对于退出一个主题也是正确的)Apple文档解释说: “暂停状态 - 应用程序在后台但未执行代码。系统会自动将应用程序移动到此状态,并且在执行此操作之前不会通知它们。暂停时,应用程序仍保留在内存中但不执行任何代码。”< / p>
由于当用户锁定屏幕时,应用程序处于后台状态,而不是立即进入挂起状态,所有执行都会停止,导致任何下载,并且没有警告即将发生这种情况......可能会有通知告诉我用户已锁定屏幕,但我还没有找到。
因此,当应用程序进入后台时,我暂停(保存某些信息并取消NSURLConnection)所有下载,并在再次激活时使用HTTP Range标头恢复它。 这是一个可行但不理想的解决方法,因为下载不会在背景中发生,从而对用户体验产生负面影响......糟糕。
答案 0 :(得分:1)
由于NSURLConnection是异步的,因此会立即到达-startDownloading方法的结尾,并退出该线程。
您确实应该在主runloop上安排连接(或使用GCD)。
设备锁定是另一个问题。设备锁定后,您的应用程序将暂停以延长电池寿命。您可以要求an extra amount of time when suspending以完成下载。
答案 1 :(得分:0)
我认为您的问题可能是,一旦退出startDownloading:
消息,NSURLConnection就会被释放(或者更准确地说,当您的自动释放池耗尽时)
但是我认为你的方法论可能有点粗鲁。 NSURLConnection你使用它的方式是异步的,无论如何似乎都是线程化的。
尝试此操作,看看它是否按预期工作(即您的应用在连接繁忙时不会暂停)
-(void)startConnectionWithUrlPath:(NSString*)URLpath {
//initiates the download connection - setup
NSURL *myURL = [[NSURL alloc] initWithString:URLpath];
myURLRequest = [NSMutableURLRequest requestWithURL:myURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
[myURL release];
[NSURLConnection connectionWithRequest:myURLRequest delegate:self];
}