需要帮助的问题。

目标
我正在整理一个iOS图书应用,该应用使用NSTimers在加载视图后触发多个交错动画事件。我创建了MethodCallerWithTimer类来帮助我做到这一点(底部代码)。

我到目前为止的解决方案
当我使用MethodCallerWithTimer类时,我将objectOwningMethod分配为我的UIViewController子类对象(这是一本书页面),然后将该方法作为该类中的实例方法。这是我分配的方法的一个示例-非常简单地打开屏幕上的某些图稿:

- (void) playEmory {
   [emoryRedArt setHidden:NO];
}

我的问题
当我创建多个MethodCallerWithTimer实例然后加载视图并全部启动它们时,我只会发生FIRST事件。其他计时器均未调用其目标方法。我怀疑我不明白我要NSRunLoop做什么或类似的事情。

有什么想法吗?

这是我的MethodCallerWithTimer类:
@interface MethodCallerWithTimer : NSObject {
    NSTimer * timer;
    NSInvocation * methodInvocationObject;
    NSNumber * timeLengthInMS;
}

- (id) initWithObject: (id) objectOwningMethod AndMethodToCall: (SEL) method;
- (void) setTime: (int) milliseconds;
- (void) startTimer;
- (void) cancelTimer;

@end

并实现:
#import "MethodCallerWithTimer.h"

@implementation MethodCallerWithTimer

- (id) initWithObject: (id) objectOwningMethod AndMethodToCall: (SEL) method {
    NSMethodSignature * methSig = [[objectOwningMethod class] instanceMethodSignatureForSelector:method];
    methodInvocationObject = [NSInvocation invocationWithMethodSignature:methSig];
    [methodInvocationObject setTarget:objectOwningMethod];
    [methodInvocationObject setSelector:method];
    [methSig release];
    return [super init];
}
- (void) setTime: (int) milliseconds {
    timeLengthInMS = [[NSNumber alloc] initWithInt:milliseconds];
}
- (void) startTimer {
    timer = [NSTimer scheduledTimerWithTimeInterval:([timeLengthInMS longValue]*0.001) invocation:methodInvocationObject repeats:NO];
}
- (void) cancelTimer {
    [timer invalidate];
}
-(void) dealloc {
    [timer release];
    [methodInvocationObject release];
    [timeLengthInMS release];
    [super dealloc];
}

@end

最佳答案

这些看起来像是一次延迟发射。您是否考虑过使用类似:

[myObject performSelector:@selector(playEmory) withObject:nil afterDelay:myDelay];

其中myObject是具有playEmory例程的实例,而myDelay是您希望操作系统在调用之前等待的秒数的float

您可以找到有关performSelector here这种风味的更多信息。

10-08 01:38