如何在NSDictionary的UITableView单元格中显示数据?

时间:2010-07-23 06:41:38

标签: iphone

您好我从udp收到了2000个数据,并在tableview中显示了这些值。最简单的方法是什么?

现在我使用两个nsthread和一个线程通过udp接收数据并将其存储在NSMutableDictionary中。另一个线程使用这些Dictionary值更新tableview。但它崩溃了我的应用程序。

以下是我使用的一些代码

我存储了像这样的接收值

 NSMutableDictionary *dictItem
 CustomItem *item = [[CustomItem alloc]init];
 item.SNo =[NSString stringWithFormat:@"%d",SNo];
 item.Time=CurrentTime;
 [dictItem setObject:item forKey:[NSString stringWithFormat:@"%d",SNo]];
 [item release];

我使用的委托方法,我使用CustomTableCells将数据显示为列副。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 1;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{
    return [dictItem count];
}



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

static NSString *identifier = @"CustomTableCell";
    CustomTableCell *cell = (CustomTableCell *)[tableView dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) 
    {
        cell = [[[CustomTableCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
    }
    NSArray *keys = [dictItem allKeys];
    CustomItem *item = [dictItem objectForKey:[keys objectAtIndex:indexPath.row]];
    cell.SNo.text = item.SNo;
    cell.Time.text  = item.Time;
    return cell;
}

错误是

由于未捕获的异常'NSGenericException'而终止应用程序,原因是:'***枚举时收集了变异。' 2010-07-23 02:33:07.891 Centrak [2034:207] Stack :(     42162256,     43320108,     42161198,     43372629,     41719877,     41719345,     9948,     3276988,     3237662,     3320232,     3288478,     71153942,     71153189,     71096786,     71096114,     71296742,     41650770,     41440069,     41437352,     51148957,     51149154,     2925426 ) 抛出'NSException'实例后调用终止

任何人都可以帮助我吗?

提前致谢.......

2 个答案:

答案 0 :(得分:0)

您可能必须使用锁定,因为当您从表视图访问字典时,它可能会被其他线程变异。 尝试查看NSLock文档。在改变你的字典之前做[myLock lock];并在变异之后做[myLock unlock];。与其他线程类似:在枚举字典之前执行[myLock lock];并在获取所有值之后执行[myLock unlock];myLock是一个NSLock对象,必须在您的线程之间共享。

答案 1 :(得分:0)

可变集合本质上不是线程安全的,因此如果将它们与多个线程一起使用,则必须首先创建不可变副本。例如,如果要遍历NSMutableDictionary中的所有键,则执行此操作(假设NSMutableDictionary被称为mutableDictionary):

NSDictionary *dictionary = [NSDictionary dictionaryWithDictionary:mutableDictionary];

for(id key in dictionary) {
  // Do anything you want to be thread-safe here.
}

如果您不想复制字典,我想您可以使用锁定或仅使用@synchronized指令,如下所示:

@synchronized(mutableDictionary) {
  // Do anything you want to be thread-safe here.
}

有关详细信息,请查看有关多线程和线程安全对象的Apple文档:http://developer.apple.com/mac/library/documentation/cocoa/conceptual/Multithreading/ThreadSafetySummary/ThreadSafetySummary.html