Хранить NSThread, содержащий NSTimer, бесконечно? (IPhone) - PullRequest
1 голос
/ 23 февраля 2010

В моем приложении есть данные веб-службы, которые необходимо обновлять каждые 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 в течение всего времени моего приложения?

Спасибо за любую помощь / совет, данный:)

Ответы [ 2 ]

5 голосов
/ 23 февраля 2010

Ты рядом. Все, что вам нужно сделать сейчас, это запустить цикл выполнения, чтобы поток не выходил и таймер работал. После вашего вызова initWithTimerInterval :, просто позвоните

[[NSRunLoop currentRunLoop] run];

Поток будет запускать цикл выполнения бесконечно, и ваш таймер будет работать.

0 голосов
/ 23 февраля 2010

Звучит так, как будто вам может понадобиться NSOperation вместо старой модной нити. Вы можете активировать операцию с помощью универсального таймера, после чего она будет выполняться в своем собственном потоке, а затем по окончании очистит свою собственную память.

...