0

我正在初始化一个带有请求的 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];
}

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

谢谢你的帮助

4

2 回答 2

0

我最终解决了这个问题。

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

我现在使用了 didFinishLaunchingWithOptions。

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

抱歉,这个误导性的问题。

于 2013-10-22T11:29:05.837 回答
0

我认为你误解了connection:didReceiveData:. 如果所有数据都不适合一个数据包,则会多次调用此方法。

来自 Apple 的文档:

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

通常,您会持有一个NSMutableDataivar 并在[_mutableData appendData:data]每次调用时connection:didReceiveData:调用。

编辑:

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

于 2013-10-08T16:40:37.797 回答