Ios 使用reloadData将解析数据重新加载到UITableViewCell会导致应用程序在一段时间后变慢

Ios 使用reloadData将解析数据重新加载到UITableViewCell会导致应用程序在一段时间后变慢,ios,objective-c,Ios,Objective C,我有一段代码,它将数据从xml解析到tableview,tableview应该显示股票的实时数据,解析器每1秒自动解析xml中的数据以收集新数据,因为这是一个类似股票的应用程序,它需要提供实时信息。它实际上工作得很好,但是问题是当我调用[self.tableview reloadData]来更新视图时,在某个时间(比如说大约30分钟左右)之后,视图行为不正常,并且滞后太多 下面是AppDelegate.m中发生的情况 - (BOOL)application:(UIApplication *)ap

我有一段代码,它将数据从xml解析到tableview,tableview应该显示股票的实时数据,解析器每1秒自动解析xml中的数据以收集新数据,因为这是一个类似股票的应用程序,它需要提供实时信息。它实际上工作得很好,但是问题是当我调用[self.tableview reloadData]来更新视图时,在某个时间(比如说大约30分钟左右)之后,视图行为不正常,并且滞后太多

下面是AppDelegate.m中发生的情况

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.

   [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(BlueChips) name:@"reloadstocks" object:nil];


    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(PennyStocks) name:@"reloadpenny" object:nil];

    return YES;

}

-(void)PennyStocks{

        NSURL *urlPenny = [[NSURL alloc]initWithString:@"urlGoesHere"];
        NSData *pennyData = [[NSData alloc]initWithContentsOfURL:urlPenny];
        NSXMLParser *pennyParser = [[NSXMLParser alloc]initWithData:pennyData];

        PennyParser *thePennyParser = [[PennyParser alloc]initPennyParser];

        [pennyParser setDelegate:thePennyParser];


        BOOL pennyWorked = [pennyParser parse];

    if(!pennyWorked){
        NSLog(@"Penny Stocks data Not working");

        [[NSNotificationCenter defaultCenter]postNotificationName:@"timeStopForPenny" object:nil];

    }
    else{
        NSLog(@"Working");
    }

}

-(void)BlueChips{

        NSURL *url = [[NSURL alloc]initWithString:@"urlGoesHere"];
        NSData *data = [[NSData alloc]initWithContentsOfURL:url];
        NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithData:data];
        Parser *theParser =[[Parser alloc]initParser];
        [xmlParser setDelegate:theParser];


        BOOL worked = [xmlParser parse];

        if(!worked){

            NSLog(@"Blue Chips data Not working");
            [[NSNotificationCenter defaultCenter]postNotificationName:@"timeStop" object:nil];


        }
        else{
            NSLog(@"Working");
        }

}
然后在我的ViewController中,我添加了一个tableview,创建了一个要调用的tableview的出口,将源代码设置为视图,然后添加了此代码,然后添加了一个刷新数据的方法:

在ViewDidDisplay中添加了一个计时器,用于循环重新加载的数据和解析方法

-(void)viewDidAppear:(BOOL)animated{
    timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(refreshData) userInfo:nil repeats:YES];
    [timer fire];


}
这是重新加载数据和单元格的方法

-(void)refreshData{
      [[NSNotificationCenter defaultCenter]postNotificationName:@"reloadstocks" object:nil];
[self.tableView reloadData];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"cello";

    if([app.listArray count] > 0 && [app.listArray count] > indexPath.row){
     theList = [app.listArray objectAtIndex:indexPath.row];
    }
    else{

        NSLog(@"Error");
    }

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Configure the cell...


    symbol.text = [NSString stringWithFormat:@"%@",theList.symbol];
    percent.text = [NSString stringWithFormat:@"%0.2f",theList.percent];
    lastPrice.text = [NSString stringWithFormat:@"%0.4f ",theList.lastprice];


    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    cell.contentView.superview.backgroundColor = [UIColor paperColorGray1100];

    return cell;
}
我删除了一些不必要的代码,以使其更具可读性,但所有这些都表明应用程序可以工作,但使用这种方法后,问题是它会变慢并冻结


我尝试了不同的方法来解决这个问题,但直到现在我仍然很难解决它。我尝试将重新加载方法发送到
dispatch_get_main_queue
,但仍然执行相同的操作,使用RowAnimation:UITableViewRowAnimationNone调用
[self.tableView重新加载RowsAndExpaths:[self.tableView IndExpathForVisibleRows]
但是仍然在做同样的事情,在主线程上使用perform selector调用方法,但是仍然在做同样的事情。我认为最好的方法是创建一个数组,该数组必须包含所有当前已解析对象和新已解析对象的另一个数组,并将这两个数组与其中的任何对象是否已更改进行比较,但我不知道在何处实现或如何实现它,由于获取了的值,比如说在我的一端,list.Symbol,并将其放入currentArray没有做的事情中(使用所述值调用外部数组只返回一个字符串,而不是返回单元格内的所有字符串)。我已经处理这个问题好几天了,所以如果你们中有人能帮助我,我将非常感激。感谢您抽出时间阅读我的帖子

您在哪里创建数组app.listArray?我觉得你使用通知的方式很奇怪;您发布来自refreshData的通知,然后立即调用reloadData,但由于数据下载是异步的,因此在调用reloadData时新数据将不可用。不过,我不知道您发布的代码中的任何内容会在运行数分钟后导致运行速度减慢。listArray是在AppDelegated中创建的。您提到的行为似乎是典型的内存泄漏行为。试着使用仪器来找出是否有一个(或多个)刚刚完成的运行仪器来检查泄漏,结果显示根本没有泄漏,但显示随着时间的推移,内存使用率变得异常高,coreanimation是应用程序的最高使用率。我不知道我的读数是否正确,因为这是我第一次使用仪器检查内存泄漏