0

ここで少し問題が発生しました... iOS アプリケーション (ゲーム) を書いている最中で、それ自体を一時停止できるようにする必要があります。そのため、メインスレッドが必要に応じてゲームを簡単に停止できるように、別のスレッドでゲームの実行を切り離すのが最善の方法であると考えました。唯一の問題は、ゲームを実行すると、再帰関数が呼び出されることです (再帰は:)

[self performSelector: withObject: afterDelay:]

再帰メソッドを新しいスレッドに分離する方法がわかりません。私はもう試した:

[NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil];

しかし、再帰なしで実行されます(1回だけ)...そして、メソッドの最後で新しいスレッドを再度切り離すと、一連の個別のスレッドで立ち往生するだけだと思います。

4

1 に答える 1

0

GCD を使用して定期的に作業を停止/開始する方法は次のとおりです。

typedef void (^loop_work_t)(void);

@interface Loop : NSObject
@property (nonatomic,assign) loop_work_t block;
@property (nonatomic,assign) NSTimeInterval interval;
@property (nonatomic,assign) dispatch_source_t timerSource;
-(id) initWithInterval:(NSTimeInterval)seconds block:(loop_work_t)block;
-(void) start;
-(void) stop;
@end


#import "Loop.h"

@implementation Loop

@synthesize interval=_interval;
@synthesize block=_block;
@synthesize timerSource=_timerSource;

-(id) initWithInterval:(NSTimeInterval)seconds block:(loop_work_t)block 
{
    if (self = [super init]){
        self.interval = seconds;
        self.block = block;
        dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        dispatch_source_t timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, backgroundQueue);
        dispatch_source_set_timer(timerSource, dispatch_time(DISPATCH_TIME_NOW, 0), seconds*NSEC_PER_SEC, 0*NSEC_PER_SEC);
        dispatch_source_set_event_handler(timerSource, ^{
            block();
        });
        self.timerSource = timerSource;
    }
    return self;
}

-(void) start {
    dispatch_resume(self.timerSource);
}

-(void) stop {
    dispatch_suspend(self.timerSource);
}

@end

使用法:

id __weak weakSelf = self;
Loop *loop = [[Loop alloc]initWithInterval:5 block:^{
    // this will run every 5 seconds
    [weakSelf someMethodOfYourClassDoingUsefulWork];
}];

この最後のブロックを任意の場所にコピー ペーストし、必要に応じて複数のループをネストします。ループへの参照を保持している限り、開始/停止できます。

[loop start]; // start the loop
[loop stop]; // stop the loop
于 2012-08-07T22:33:41.830 に答える