1

我有一个 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];
}
4

2 回答 2

3

您可以调用 NSURLConnection 的取消方法,它会阻止您的连接委托被调用任何更多数据。您可以在 viewWillDisappear 中执行此操作,如果这是有意义的,因为您的应用程序是如何工作的。

于 2011-11-10T15:34:32.067 回答
2

绝对可以cancel NSURLConnection

但是你也应该小心取消它。

如果你决定cancelviewWillDisappear,

然后

你不应该这样做,

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方法中你必须做的是,

  1. 需要检查 nsurlconnection != nil
  2. 需要取消
  3. 需要为您的 nsurlconnection 分配 null
  4. 需要用同样的方法释放它。

示例代码将如下所示,

- (void) viewWillDisappear:(BOOL)animated
{

if (nsurlconnection != nil)
{
[nsurlconnection cancel];
[nsurlconnection release];
nsurlconnection = nil;
}

}

希望它有帮助......快乐的编码......

于 2013-06-06T14:13:11.313 回答