В моем приложении есть данные веб-службы, которые необходимо обновлять каждые 3 минуты.
На прошлой неделе я попробовал несколько подходов, но получил действительно хороший совет: мне не следует создавать новый поток каждые 3 минуты, а затем впоследствии пытаться выполнять выборку и синхронизировать все различные части, чтобы избежать ошибки памяти. Вместо этого у меня должен быть «рабочий поток», который всегда работал, но выполнял реальную работу только тогда, когда я тоже его просил (каждые 3 минуты).
Поскольку мой маленький POC работает сейчас, я создаю новую ветку в applicationDidFinishLaunching
метод. Я делаю это так:
[NSThread detachNewThreadSelector:@selector(updateModel) toTarget:self withObject:nil];
- (void) updateModel {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
BackgroundUpdate *update = [[BackgroundUpdate alloc] initWithTimerInterval:180];
[update release];
[pool release];
}
Хорошо, это устанавливает объект "BackgroundUpdate" с интервалом обновления в секундах. Внутри апдейтера пока просто так:
@implementation BackgroundUpdate
- (id) initWithTimerInterval:(NSInteger) secondsBetweenUpdates {
if(self = [super init]) {
[NSTimer scheduledTimerWithTimeInterval:secondsBetweenUpdates
target:self
selector:@selector(testIfUpdateNeeded)
userInfo:nil
repeats:YES];
}
return self;
}
- (void) testIfUpdateNeeded {
NSLog(@"Im contemplating an update...");
}
Я никогда раньше не использовал подобные темы. У меня всегда была «настройка autoReleasePool, работай, получи свой autoReleasePool, и прощай».
Моя проблема в том, что как только initWithTimerInterval
запустится, NSThread
будет завершен, поэтому он вернется к методу updateModel и его пул будет очищен. Я думаю, это связано с тем, что NSTimer имеет свой собственный поток / runloop? Я хотел бы, чтобы поток продолжал запускать метод testIfUpdateNeeded
каждые 3 минуты.
Так, как я буду поддерживать этот NSThread в течение всего времени моего приложения?
Спасибо за любую помощь / совет, данный:)