【问题标题】:Abort NSUrlConnection during his "connecting" state在他的“连接”状态中中止 NSUrlConnection
【发布时间】:2017-04-07 17:26:05
【问题描述】:

首先,我不认为这个问题已经存在,但我同意有类似的帖子,请继续阅读。

我的问题是:如何中止处于“正在连接”状态的 NSUrlConnection?我的意思是,建立连接后,我们可以使用NSUrlConnection cancel 方法取消请求。但是,在服务器没有提供响应(在接收任何委托调用之前)达到超时之前,如何在“连接”状态中中止它?

感谢您的宝贵时间!

编辑

我应该使用NSURLSession​Task 而不是NSUrlConnection 来做到这一点(使用它的方法cancel)?

编辑 2 - 代码示例

NSURLConnection* m_connection;
m_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
if(m_connection){
    [m_connection start];

    m_timer = [NSTimer scheduledTimerWithTimeInterval: FLT_MAX
                                               target: self selector: @selector(doNothing:)
                                             userInfo: nil repeats:YES];
    m_runLoop = [NSRunLoop currentRunLoop];
    [m_runLoop addTimer:m_timer forMode:NSDefaultRunLoopMode];
    while (m_bRunLoop && [m_runLoop runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]);

    [m_connection cancel];
}

我使用我的连接来传输数据。如您所见,现在我将连接设置 m_bRunLoop 中止到 false 并且没关系。但我的问题是:如何在服务器发送响应之前中止我的连接,而不等待整个超时?

【问题讨论】:

  • 你能把你创建NSURLConnection实例的代码贴出来,你想取消它们的地方,是在同一个类还是不同类?
  • 我编辑了我的帖子,不同的班级或相同的没关系,我可以处理。

标签: ios nsurlconnection


【解决方案1】:

您仍然可以致电[NSURLConnection cancel] 取消连接并且不再有委托呼叫。请记住,如果要重新连接,则必须创建一个新的连接对象。根据您的问题,我推断您在收到任何代表电话之前如何拨打cancel 电话有问题,是这样吗?

另外,请考虑将NSURLSession API 与数据任务一起使用,因为在大多数情况下这可能是处理网络的更好方法。

编辑(添加代码时):

首先,请注意,将计时器添加到您的运行循环不会改变任何内容,因为 NSTimer 不被视为运行循环的输入源(如果您真的“什么都不做”)。

第二 - 如果你将 m_bRunLoop 设置为 false,你可以在某个地方执行它,虽然你没有提供代码 - 但这将是取消连接的地方,所以我们将这个地方命名为“cancelConnection”方法。

修改你的代码如下:

m_connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO];
if(m_connection){
    yourConnectionThread = [NSThread currentThread]; // store your thread in instance variable
    [m_connection start];

    m_timer = [NSTimer scheduledTimerWithTimeInterval: FLT_MAX
                                               target: self selector: @selector(doNothing:)
                                             userInfo: nil repeats:YES];
    m_runLoop = [NSRunLoop currentRunLoop];
    [m_runLoop addTimer:m_timer forMode:NSDefaultRunLoopMode];

}

并实现取消连接的方法,记住你需要在开始连接的线程上调用取消:

- (void)cancelConnection {
    //m_bRunLoop = false <- this was before here
    [m_connection performSelector:@selector(cancel) onThread:yourConnectionThread withObject:nil waitUntilDone:YES];

}

最后,而是作为注释 - 请记住 NSRunLoop 不是线程安全的,您不应该从不同的线程调用它的方法。

【讨论】:

  • 是的,我的问题是在收到任何代表电话之前取消它!
  • 那么这就是你的代码架构的问题。作为一个快速补丁,您可以将所有 NSURLConnections 存储在执行请求的类的某个 NSDictionary 实例变量中,当您“在正确的地点和时间”取消连接时,从字典中选择正确的一个并调用cancel 就可以了。
  • 好吧,谈谈架构,我有一个NSThread,它会进行一些初始化然后启动连接(用于流数据),我希望能够随时中止连接,因为问题是我需要在这个线程上做一个“加入”,我不想等待超时。
  • 你能把你创建NSURLConnection实例的代码贴在哪里,你想取消它们,是在同一个类还是在不同类?您必须存储对NSURLConnection 的引用,以便稍后您可以取消它。
  • 感谢您的建议。我稍后会尝试并保持联系!
猜你喜欢
  • 1970-01-01
  • 2011-11-30
  • 1970-01-01
  • 2019-06-24
  • 2021-09-02
  • 2011-06-15
  • 2013-05-07
  • 2019-06-03
  • 2014-08-18
相关资源
最近更新 更多