您好我从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'实例后调用终止
任何人都可以帮助我吗?
提前致谢.......
答案 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