Таймер, чтобы сделать некоторые операции и не вызывать метод? - PullRequest
0 голосов
/ 16 января 2012

Я, очевидно, знаю, как использовать NSTimers и таймеры cocos2d, такие как:

[self schedule: @selector(updater:) interval:0.5];

но все эти таймеры вызывают функцию. я не хочу этого.

мне нужен таймер, который в моем методе будет считать, и в конце выполнит одну операцию, такую ​​как переключение BOOL или изменение целого числа.

Есть ли простой способ сделать это в 1 строку?

большое спасибо

Ответы [ 2 ]

2 голосов
/ 16 января 2012

Попробуйте это:

@interface CCScheduler (BlockAddition)

- (id)scheduleAfterDelay:(ccTime)delay block:(void(^)(ccTime dt))block;

@end

@interface NSObject (BlockAddition)

- (void)cc_invokeBlock:(ccTime)dt;

@end

@implementation NSObject (BlockAddition)

- (void)cc_invokeBlock:(ccTime)dt {
    void(^block)(ccTime dt) = (id)self;
    block(dt);
}

@end

@implementation CCScheduler (BlockAddition)

- (id)scheduleAfterDelay:(ccTime)delay block:(void(^)(ccTime dt))block {
    block = [block copy];
    [self scheduleSelector:@selector(cc_invokeBlock:) forTarget:block interval:0 paused:NO repeat:0 delay:delay];
    return block;
}

@end

Пример

[[CCDirector sharedDirector].scheduler scheduleAfterDelay:0.1 block:^(ccTime dt) {
     NSLog("time's up");
}];

или если вы используете старую версию cocos2d

[[CCScheduler sharedScheduler] scheduleAfterDelay:0.1 block:^(ccTime dt) {
     NSLog("time's up");
}];
1 голос
/ 24 июня 2012

Мне пришлось изменить расписание и отменить его, чтобы он не вызывал ... вот так:

#import "SchedulerBlock.h"
#import "cocos2d.h"

@implementation NSObject (BlockAddition)

- (void)cc_invokeBlock:(ccTime)dt {
    void(^block)(ccTime dt) = (id)self;
    block(dt);
    [[CCScheduler sharedScheduler] unscheduleSelector:_cmd forTarget:block];
}

@end

@implementation CCScheduler (BlockAddition)

- (id)scheduleAfterDelay:(ccTime)delay block:(void(^)(ccTime dt))block {
    block = [block copy];
    [self scheduleSelector:@selector(cc_invokeBlock:) forTarget:block interval:delay paused:NO];
    return block;
}
@end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...