Я разрабатываю UIView, где должен быть процесс, который обращается к удаленной базе данных и должен обновить UITableView с полученными результатами.
Для этого я планирую использовать NSTimer, который каждые 10 секунд запускает процесс обновления, при котором осуществляется доступ к базе данных и извлечение данных.
Проблема в том, что если я запустлю это в главном потоке, представление будет заморожено до тех пор, пока данные не будут извлечены и загружены.
Кто-нибудь знает, какой лучший способ сделать это? Любой пример будет оценен.
Спасибо.
РЕДАКТИРОВАТЬ ----
Это код, который я использую для запуска и остановки процесса обновления:
-(void)startUpdating
{
self.isUpdating = YES;
timerLoop = [[NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(listMustBeUpdated:) userInfo:nil repeats:YES] retain];
[[NSRunLoop mainRunLoop] addTimer: timerLoop
forMode: UITrackingRunLoopMode];
}
-(void)stopUpdating
{
self.isUpdating = NO;
[timerLoop invalidate];
[timerLoop release];
timerLoop = nil;
}
Кроме того, через несколько минут приложение работает без сообщения об ошибке. Я думаю, это потому, что использование памяти или зомби, но я проверил с инструментами, и использование памяти было 3,11 Мб (в реальном времени) и без зомби.
Может, потому что таймер?
Спасибо.
РЕДАКТИРОВАТЬ --- 2
Хорошо, теперь это код, который я использую для всего вопроса, и все еще замораживаю UITableView во время прокрутки.
Может, потому что обновляется из потока, а прокрутка выполняется из основного потока?
-(void)loadMessagesFromUser:(int)userId toUserId:(int)userToId
{
fromUserId = userId;
toUserId = userToId;
messages = [OTChatDataManager readMessagesFromUser:userId toUser:userToId];
lastMessageId = [[messages getValueByName:@"Id" posY:[messages CountY]-1] intValue];
[list reloadData];
}
-(void)messagesMustBeUpdated:(id)sender
{
if ([NSThread isMainThread]) {
[self performSelectorInBackground:@selector(updateMessages:) withObject:nil];
return;
}
}
-(void)updateMessages:(id)sender
{
iSQLResult *newMessages = [OTChatDataManager readMessagesFromUser:fromUserId toUser:toUserId sinceLastMessageId:lastMessageId];
for (int a=0;a<[newMessages CountY];a++)
{
[messages.Records addObject:[newMessages.Records objectAtIndex:a]];
messages.CountY++;
}
lastMessageId = [[messages getValueByName:@"Id" posY:[messages CountY]-1] intValue];
[list reloadData];
}
-(void)startUpdating
{
self.isUpdating = YES;
timerLoop = [[NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(messagesMustBeUpdated:) userInfo:nil repeats:YES] retain];
}
-(void)stopUpdating
{
self.isUpdating = NO;
[timerLoop invalidate];
[timerLoop release];
timerLoop = nil;
}
loadMessagesFromUser может вызываться из mainThread и обращаться к одному и тому же неатомическому объекту. Возможно ли тихое падение из-за этого?
функции запуска и остановки вызываются из основного потока. Остальное - это таймер.
Спасибо за ответы.