我正在尝试聊天。我已经用Google搜索了样本,我在this帖子中跟踪了几个没有成功的帖子我已经找到了我发现的第一个问题,并且我已经应用了每个答案都没有成功。
我正在尝试的是在UIViewController中我加载到UIView的2个子类,每个子类都有一个UITableView。在其中一个视图中,我将加载用户列表,而在其他视图中,用第一个类中的选定用户发送消息。
首先,我尝试在内容的每个类中使用线程,但由于内存警告而崩溃。
现在我在UIViewController中使用NSTimer调用更新这两个类,但仍然崩溃。
这是代码:
-(void)chatStartUpdating
{
chatIsUpdating = YES;
chatLoop = [NSTimer scheduledTimerWithTimeInterval:5.0f target:self selector:@selector(backgroundChatUpdate) userInfo:nil repeats:YES];
}
-(void)chatStopUpdating
{
if (chatLoop == nil) return;
[chatLoop invalidate];
chatLoop = nil;
chatIsUpdating = NO;
}
-(void)updateChat
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[chatBar updateList:nil];
[chat messagesMustBeUpdated:nil];
[pool release];
}
-(void)backgroundChatUpdate
{
[self performSelectorOnMainThread:@selector(updateChat) withObject:nil waitUntilDone:NO];
//[self performSelectorInBackground:@selector(updateChat) withObject:nil];
}
如果我在后台运行,则滚动消息列表变慢,经过几次更新后,我开始接收内存警告并且应用程序崩溃。
当用户按下聊天按钮或某些用户列表时,将从主线程调用启动和停止更新方法。
任何人都知道代码的一个很好的例子来做类似的事情吗?或者指出正确的方法?
提前致谢。
EDIT ----
这两个UIViews中的类从远程API检索数据,在类中解析结果以包含它并用结果填充tableview:
-(void)updateList:(id)sender
{
isReading = YES;
users = [OTChatDataManager readUsers];
[list reloadData];
NSLog(@"ChatBar Was updated");
isReading = NO;
}
-(void)messagesMustBeUpdated:(id)sender
{
isReading = YES;
iSQLResult *newMessages = [OTChatDataManager readMessagesFromUser:fromUserId toUser:toUserId sinceLastMessageId:lastMessageId];
[self mergeMessages:newMessages];
[list reloadData];
[newMessages release];
isReading = NO;
}
2个列表的所有属性都被声明为原子,我尝试了在这篇文章的链接中提出的每个解决方案,GDC,Locks等...