我有一个tableview应用程序,当用户选择一个视图时,它需要解析一些XML来显示信息。但有时XML没有完成下载,用户可以按下按钮选择另一个视图,产生崩溃。我想我需要取消连接或不要引起新连接的任何混淆,但我不确切知道如何,它假设在ViewWillDisappear正确吗? 以下是我如何在ViewDidAppear上启动连接:
NSMutableURLRequest * req = [[NSMutableURLRequest alloc]initWithURL:[NSURL URLWithString:@"http://Adress"]
cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:20.0f];
conn = [NSURLConnection connectionWithRequest:req delegate:self];
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
if(conn)
{
receivedData = [[NSMutableData alloc]init];
[DSBezelActivityView newActivityViewForView:self.view withLabel:@"Loading..."];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
if(conn) [conn cancel];
}
答案 0 :(得分:3)
您可以调用NSURLConnection的cancel方法,它将阻止您的连接委托被更多数据调用。您可以在viewWillDisappear中执行此操作,如果在您的应用程序如何工作时它是有意义的。
答案 1 :(得分:2)
绝对可以cancel NSURLConnection
。
但你也应该小心取消它。
如果您决定在cancel
中viewWillDisappear
,
然后
你不应该这样做,
autorelease
也不应该,
release
它在任何地方。
以下简要说明:
在cancel
NSURLConnection
viewWillDisappear
代表
[nsurlconnection cancel];
你也应该release
在这里,
[nsurlconnection release];
如果您在收到connection
之后的某个地方发布xml response
,
无论如何都会调用viewWillDisappear
方法,
这里你取消它,然后它会导致你的应用程序崩溃。
“取消分配的对象不会被取消”
取消时还会出现另一种情况,
如果用户第一次来到并立即导航其他视图,则nsurlconnection
方法将取消viewWillDisappear
。
用户再次来到view
并在nsurlconnection
初始化或分配之前立即转义,您的应用也会崩溃,因为,
“取消分配的对象不会被取消”。
因此,请在connection != nil
之前检查cancel
而且也不要忘了做
nsurlconnection = nil;
在同一时间。
这样你就可以避免立即调用[nsurlconnection cancel]崩溃。
所以最后,在你的viewWillDisappear
方法中,你必须做的是,
- 需要检查nsurlconnection!= nil
- 需要取消
- 需要为您的nsurlconnection
分配null- 需要以相同的方法释放它。
醇>
示例代码如下所示
- (void) viewWillDisappear:(BOOL)animated
{
if (nsurlconnection != nil)
{
[nsurlconnection cancel];
[nsurlconnection release];
nsurlconnection = nil;
}
}
希望它有用......快乐的编码......