Iphone 单独线程上的异步NSURLConnection无法调用委托方法

Iphone 单独线程上的异步NSURLConnection无法调用委托方法,iphone,objective-c,multithreading,nsurlconnection,nsurlconnectiondelegate,Iphone,Objective C,Multithreading,Nsurlconnection,Nsurlconnectiondelegate,我在一个单独的线程上运行NSURLConnection(我知道它是异步的,在主线程上运行时可以工作),但即使我将父线程作为委托传递,它也不会进行委托调用。有人知道怎么做吗 代码: 编辑* 我需要在单独的线程上运行NSURLConnection的原因是,我正在iPhone应用程序中下载某些内容,当用户锁定屏幕时,下载将取消(如果用户只需按下home按钮,应用程序进入后台,下载将继续正常进行)。我理解这是因为我在主线程上异步运行连接,而不是单独运行连接 在启动NSURLConnection时,我也尝

我在一个单独的线程上运行NSURLConnection(我知道它是异步的,在主线程上运行时可以工作),但即使我将父线程作为委托传递,它也不会进行委托调用。有人知道怎么做吗

代码:

编辑*

我需要在单独的线程上运行NSURLConnection的原因是,我正在iPhone应用程序中下载某些内容,当用户锁定屏幕时,下载将取消(如果用户只需按下home按钮,应用程序进入后台,下载将继续正常进行)。我理解这是因为我在主线程上异步运行连接,而不是单独运行连接

在启动NSURLConnection时,我也尝试过此代码(不是在单独的线程中):

  NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:myURLRequest delegate:self startImmediately:NO];
   [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
   [connection start];
   [connection release];
但我有同样的问题,关于下载被取消屏幕锁定

*更新

为了补充Thomas的以下回答(请注意,James Webster关于退出线程的回答也是正确的),Apple文档解释: 挂起状态-应用程序处于后台,但未执行代码。系统会自动将应用程序移动到此状态,并且在执行此操作之前不会通知它们。挂起时,应用程序保留在内存中,但不会执行任何代码

由于当用户锁定屏幕时,应用程序会进入后台状态,然后立即进入暂停状态,所有执行都会停止,停止任何下载,并且不会发出即将发生的警告。。。可能会有通知告诉我用户已锁定屏幕,但我尚未找到

因此,当应用程序进入后台时,我会暂停(保存某些信息并取消NSURLConnection)所有下载,并在再次激活时使用HTTP范围标头恢复下载。
这是一个可行的解决办法,但并不理想,因为下载不是在后台进行的,这会对用户体验产生负面影响。。。糟糕透了

我认为您的问题可能是,一旦退出
startDownloading:
消息(或者更准确地说,当您的自动释放池耗尽时),NSURLConnection就已解除分配

然而,我认为你的方法论可能有点粗俗。NSURLConnection您使用它的方式是异步的,并且看起来无论如何都是线程化的

试试这个,看看它是否能像你期望的那样工作(即,当你的连接忙时,你的应用不会暂停)


由于NSURLConnection是异步的,因此会立即到达-startDownload方法的末尾,线程退出

您确实应该在主runloop上安排连接(或使用GCD)


设备锁定是另一个问题。设备锁定后,应用程序将暂停以节省电池寿命。您可能可以请求以完成下载。

您用于NSURLConnection请求的方法本身是异步的,因此即使您不分离新线程,也将是多线程操作。编辑的问题可以更好地解释我的问题。编辑的问题可以更好地解释我的问题。好的,您的编辑是有意义的。那么请注意我回答的第一点。看来你的NSURLConnection几乎马上就被解除了。这个答案在我的问题更新中也被引用为是正确的。谢谢。我根据你的答案更新了我的问题。似乎要求更多时间只是为了后台应用,而不是那些被暂停的应用。
  NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:myURLRequest delegate:self startImmediately:NO];
   [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
   [connection start];
   [connection release];
-(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];
}