【问题标题】:Why does NSURLConnection delegate error method get called once connection is finished with为什么连接完成后会调用 NSURLConnection 委托错误方法
【发布时间】:2013-10-15 16:46:45
【问题描述】:

我正在使用请求初始化一个 NSURLConnection,并且设置了 didFailWithError 和 didReceiveData。

应用程序将成功地使用这两种方法来处理我希望它使用它们的任何情况,但是如果您在应用程序中切换到离线模式,即使我不再需要它们,也会为我设置的任何委托调用 didFailWithError .

如果真正的用户失去了连接,我不希望执行这些方法。

-(void) RequestExample 
{
    NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:someRequest delegate:self];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
    [self NotifyObserversOfFailure];
}

-(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];
    [self NotifyObserversOfSuccess];
}

有人建议检查这些方法中的错误代码,但感觉不像是修复。 我读过的其他地方是 nil 连接,但我会把它放在哪里,因为把它放在 didReceiveData 方法中不起作用。

感谢您的帮助

【问题讨论】:

    标签: ios objective-c nsurlconnection nsurlconnectiondelegate


    【解决方案1】:

    我认为您误解了connection:didReceiveData: 的性质。如果所有数据都不能放入一个数据包中,则会多次调用此方法。

    来自 Apple 的文档:

    作为连接发送以增量方式加载数据。 此方法为异步委托提供了检索加载数据的唯一方法。委托人有责任在交付时保留或复制此数据。

    通常情况下,您将持有 NSMutableData ivar 并在每次调用 connection:didReceiveData: 时调用 [_mutableData appendData:data]

    编辑:

    我注意到在我自己的应用程序中,无论是否有错误,只要 Web 服务完成,就会调用 connection:didFailWithError:。因此,您可以使用connection:didReceiveData:connection:didFailWithError: 聚合数据,然后知道Web 服务已完成。

    【讨论】:

    • connection:didFailWithError: 仅应在连接失败时调用。所以,发生了一些奇怪的事情。
    • 我正在使用它进行身份验证,因此响应很小。问题是我的应用程序可能会打开几个小时,但是当切换到离线模式或手机丢失 3g 时,didFailWithError 会为我拥有的所有代表调用。我希望代理登录并尽可能禁用或删除它。有什么办法可以做到这一点或阻止它在连接失败时被调用?我可以实现布尔逻辑,但感觉会有更好的方法。
    • 处理这个最简单的方法是 nu 追加数据 continuo:-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [receivedData appendData:data]; }
    【解决方案2】:

    我最终解决了这个问题。

    我假设如果手机失去 3G 连接,会调用 didFailWithError,因为我通过将手机切换到飞行模式来模拟这种情况。 在这样做时,我通过打开通知栏来停用应用程序,并在关闭它时激活它,因此正在调用 applicationDidBecomeActive(它检查了会话,失败并调用了 didFailWithError)。

    我现在使用了 didFinishLaunchingWithOptions。

    我不知道如果数据太大,didReceiveData 会被多次调用,所以谢谢你的回答。

    抱歉,这个误导性问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2014-07-03
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      相关资源
      最近更新 更多