1

私は次のようにNSTimer定義しています:

timer = [NSTimer scheduledTimerWithTimeInterval:30
                                         target:self
                                       selector:@selector(fooBar)
                                       userInfo:nil
                                        repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

fooBarこの場合、バックグラウンド スレッドを使用してコールバック関数を呼び出します。しかし、チェックすると、常にメインスレッドで取得していますif ([NSThread mainThread])。コールバック関数からスレッドをディスパッチする以外に方法はありますか?

4

2 に答える 2

4

メインスレッドにタイマーを追加しています。コールバックもメインスレッドになります。バックグラウンド スレッドでタイマーをスケジュールするには、NSOperation サブクラスを使用し、オペレーションのメインメソッド内から [NSRunLoop currentRunLoop] にタイマーをスケジュールする必要があると思います。

#import <Foundation/Foundation.h>

@interface BackgroundTimer : NSOperation
{
    BOOL _done;
}
@end



#import "BackgroundTimer.h"

@implementation BackgroundTimer

-(void) main
{
    if ([self isCancelled])
    {
        return;
    }

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:30
                                             target:self
                                           selector:@selector(fooBar)
                                           userInfo:nil
                                            repeats:YES];

    [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

    //keep the runloop going as long as needed
    while (!_done && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                                              beforeDate:[NSDate distantFuture]]);

}

@end
于 2013-03-29T20:50:35.547 に答える