保持包含NSTimer的NSThread无限期? (苹果手机)

时间:2010-02-23 13:06:26

标签: iphone nstimer nsthread

我的应用中有一些Web服务数据需要每3分钟更新一次。 我曾尝试过一些方法,但上周在这里得到了一个非常好的建议,我不应该每隔3分钟建立一个新线程然后尝试dealloc并同步所有不同的部分,以便我避免内存错误。相反,我应该有一个始终在运行的“工作线程”,但只在我提出要求的时候才进行实际工作(每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有关吗?我想让线程继续每隔3分钟运行testIfUpdateNeeded方法。

那么,如何在整个应用期间保持此NSThread活着?

感谢您提供的任何帮助/建议:)

2 个答案:

答案 0 :(得分:5)

你很亲密。您现在需要做的就是启动运行循环运行,这样线程就不会退出并且计时器会运行。在调用initWithTimerInterval:之后,只需调用

[[NSRunLoop currentRunLoop] run];

线程将无限期地运行其运行循环,并且您的计时器将起作用。

答案 1 :(得分:0)

听起来你可能想要一个NSOperation而不是旧的时尚线程。您可以通过通用计时器激活操作,然后它将在自己的线程上执行,然后在完成时清理自己的内存。