传递 NSTimer 有参数

Posted

技术标签:

【中文标题】传递 NSTimer 有参数【英文标题】:Passing NSTimer has parameter 【发布时间】:2013-02-28 06:07:02 【问题描述】:

我有一个采用NSTimer 的方法,它的参数在A 类中

-(void)demoMethod:(NSTimer *)timer
    //Do something!

现在我已经覆盖了该方法的测试用例:

-(void)testDemoMethodPassNilTimer

    //Created class Instance for the ClassA

    ClassA *testA = [[ClassA alloc]init];

    //[test testDemoMethod:nil];

    STAssertThrows([testA testDemoMethod:nil],@"should throw exception");



-(void)testDemoMethodPassTimer

    ClassA *testA = [[ClassA alloc]init];
    STAssertNoThrows([testA testDemoMethod:??????]);

为测试用例方法testDemoMethodPassTimer 传递NSTimer 对象的参数的正确方法应该是什么?

【问题讨论】:

是否要传递参数给 NSTimer 以在 demoMethod: 方法中访问? 【参考方案1】:

给它一个实际的计时器对象,但不要将它安排在运行循环中。

【讨论】:

【参考方案2】:

我也需要将参数解析为 NSTimer。所以我想出了创建类别类,这对我有帮助。

以下是在 NSTimer 上创建 Category 类的步骤。

    右键单击项目并选择“新建文件” Cacoa Touch > Objective-C 类别 > 下一步 给出类别:添加和类别:NSTimer 在 .h 文件中只需创建 placeId 的属性 在.m 中使用@dynamic 合成它并创建setter、getter 将该 .h 文件导入您的文件中。

NSTimer+additions.h 文件

#import <Foundation/Foundation.h>

@interface NSTimer (additions)

     @property(nonatomic,retain)    NSString  *additionalTag;

@end

NSTimer+additions.m 文件

#import "NSTimer+additions.h"
#import <objc/runtime.h>

NSString *const additionalTagKey = @"additionalTagKey";

@implementation NSTimer (additions)
@dynamic additionalTag;

- (void)setAdditionalTag:(NSString*)aObject

    objc_setAssociatedObject(self, additionalTagKey, aObject, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

- (NSString*)additionalTag

    return objc_getAssociatedObject(self, additionalTagKey);


@end

现在 #import "NSTimer+additions.h" 在你的课堂上使用 NSTimer

将参数传递给 NSTimer

-(void)testDemoMethodPassTimer

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
                              target:self
                              selector:@selector(timerTick:)
                              userInfo:nil
                              repeats:YES];
    timer.additionalTag = @"parameter passed to timer";

    ClassA *testA = [[ClassA alloc]init];
    STAssertNoThrows([testA testDemoMethod:timer]);

从计时器中检索参数

-(void)demoMethod:(NSTimer *)timer
    NSLog(@"My Parameter: %@",timer.additionalTag);

涉及许多步骤,但希望对您有所帮助。 :)

【讨论】:

以上是关于传递 NSTimer 有参数的主要内容,如果未能解决你的问题,请参考以下文章

NSTimer 中的 UserInfo 没有传递正确的信息 - Swift

将参数传递给 NSTimer 在 Swift 中调用的方法

将参数传递给由 NSTimer 调用的方法

Swift Playground 中的 NSTimer.scheduledTimerWithTimeInterval

NSTimer 和 NSInvocation,定时器不触发

使用 NSTimer 时如何更改 userInfo 中的数据?