在iPhone上刷新数据会导致系统不稳定或无响应

时间:2010-09-28 11:13:03

标签: ios nsurlconnection nstimer

我在这里遇到问题的每个人

我需要在一段时间内更新plist数据

我使用Tab Bar切换2个视图

当我选择view1时,它将从URL加载数据

但是如果我切换到view2,view1仍然会更新数据

如果切换到view2并切换回来,view2会不断更新数据。

这是我用来更新数据的代码 在LoadData.h中

@interface LoadData : UITableViewController < NSNetServiceBrowserDelegate > {
NSArray     *plist;
NSTimer     *timer;
}
LoadData.m中的

static const float REFRESH_STATUS_TIME = 2.0;
- (void)viewDidLoad {
timer = [NSTimer scheduledTimerWithTimeInterval:REFRESH_STATUS_TIME
                                                    target:self
                                                    selector:@selector(timerFired:)
                                                    userInfo:nil                
                                                    repeats:YES];
[super viewDidLoad];
}
- (void)timerFired:(NSTimer *)theTimer{
NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://10.85.28.99/envotouch/req_light.php"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
                                          timeoutInterval:60.0];

    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
    NSLog(@"\n\nCONNECTION:   %@", theConnection);
    NSData *returnData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil]; 
    NSString *listFile = [[NSString alloc] initWithData:returnData encoding:NSASCIIStringEncoding];   
    self.plist = [listFile propertyList];

    [self.tableView reloadData]
}

所以我的问题是当我切换到另一个视图时如何终止数据更新?

感谢回复.....这是一个让我烦恼的大错误

2 个答案:

答案 0 :(得分:2)

请勿使用sendSynchronousRequest:returningResponse:error:。您的程序在该呼叫期间被完全阻止,如果网络没有响应或服务器已关闭,甚至可以由操作系统终止。

仅使用异步NSURLConnection。您可以随时向他们发送cancel消息。

答案 1 :(得分:2)

如果您使用异步NSURLConnection,则可以在切换到另一个视图时将取消消息发送到连接(仍在忙于加载)。异步方法将使您的UI响应为奖励,同步方法不会像Ole Begemann所指出的那样。

您可以在此处找到有关如何使用异步方法的信息:URL Loading System Programming Guide

编辑:当视图未显示时,您可能也会停止计时器(通过发送无效消息),这样当未显示视图导致负载时计时器不会触发数据。

NSTimer Class Reference