iPhone 4 iOS 5可以安全地从后台选择器刷新UITableView吗?

时间:2011-11-11 00:19:57

标签: objective-c multithreading uitableview ios5 iphone-4

我的一个视图控制器上有一个UITableView,它使用来自我的应用程序的多个部分的日志消息进行异步更新。它工作得很好,但今天我发现了一个奇怪的错误。大约2个小时后,整个桌面视图变为空白。没有单元格,没有行分隔符,只有背景颜色。

此表格视图中只有2个输入路径。

NSMutableArray* tableViewCellData;

//in the init method:
 tableViewCellData = [[NSMutableArray alloc]initWithCapacity:15];

 -(void)setContextActionWithTitle:(NSString *)title description:(NSString *)description

        ContextConsoleLogItem* temp = [[ContextConsoleLogItem alloc] initWithDate:[NSDate date] title:title message:description contextAction:kNoContextAction];
        [tableViewCellData insertObject:temp atIndex:0];  
        [contextActionTableView reloadData];
    }

//pretty standard data source management
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{

    // Return the number of sections.
    return kNumberOfSections;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    return [tableViewCellData count];
}

//here's how the cell displays itself.
    #pragma mark -
    #pragma mark Cell customization
    -(void)configureCell:(UITableViewCell*) cell atIndexPath:(NSIndexPath*) indexPath
    {
        ContextConsoleLogItem* logItem = [tableViewCellData objectAtIndex:indexPath.row];

        cell.backgroundColor = [UIColor blackColor];
        cell.textLabel.textColor = [UIColor whiteColor];
        cell.textLabel.font = [UIFont systemFontOfSize:9];
        cell.detailTextLabel.textColor = [UIColor whiteColor];
        cell.textLabel.text = logItem.message;
        cell.textLabel.numberOfLines =3;
    }

可能导致tableview“丢失”所有数据并停止响应

的原因
-(void)setContextActionWithTitle:(NSString *)title description:(NSString *)description

我怀疑的一件事是NSMutableArray的容量不足。它会很快达到最大容量。使用上述方法发布的一些消息来自对performSelectorInBackground的调用。可能是我的一个后台选择器遇到NSMutableArray的容量并且无法重新分配它?但话说回来,即使是空的tableview仍然应该有单元格,所以我应该能够看到行分隔符。

我应该使用setContextActionWithTitle:description:将来电打包到performSelectorOnMainThread吗?

是不是已经进行了两次单独的更新tableview的调用,并且他们以某种方式将表保持在一个不一致的状态? (我这里没有任何例外)

这是一个非常令人费解的行为,我很感激在调试它时有任何帮助!

2 个答案:

答案 0 :(得分:6)

永远不要在后台线程中触摸UIKit中的任何内容。如初。

答案 1 :(得分:1)

  

我怀疑有一件事是NSMutableArray分配的容量不足

绝对不是这样。 As stated in the docs

  

可变阵列根据需要扩展; numItems只是建立对象的初始容量。

Jim是正确的,从不在后台线程中触摸UIKit。