以特定间隔显示NSArray

时间:2014-05-27 20:20:16

标签: objective-c macos cocoa nsarray

我有NSArray我希望以特定的时间间隔显示每个对象,例如:

NSArray *array = [NSArray arrayWithObjects:@"foo",@"bar",@"baz",nil];

输出:

for (object in array) {
     NSLog(@"%@", object);
     // wait 3 seconds then show next object
}

所以它应该这样做:

foo 
... wait three seconds 
bar
... wait three seconds
baz
... wait three seconds
repeat

我该怎么做?

2 个答案:

答案 0 :(得分:2)

根据周围环境,您可以通过让NSRunLoop运行3秒钟来完成您想要的操作。或者,也许更安全一点,你可以使用NSTimer每3秒运行一次动作。

我最初建议分解循环,记录第一个元素,然后在3秒延迟后对数组的其余部分执行相同的操作,使用performSelector:withObject:afterDelay:或{{1}之类的内容},但正如danielbeard指出的那样,dispatch_after提供了一种更直接的取消操作的方法(可以使用其他方法取消,但需要计划和手动工作)。


编辑 :如果我要使用NSTimer执行此操作,我可能会使用this NSTimer+Blocks category并执行类似操作(未经测试)代码):

NSTimer

答案 1 :(得分:2)

最简单的方法是使用Blocks ...

您可以使用第三方类别探索如何使用块执行此操作,例如: https://github.com/zwaldowski/BlocksKit

对于没有块的解决方案:

@property (nonatomic, strong) NSArray *myArray;
@property (nonatomic) NSInteger iteration;

- (void)awakeFromNib //Or equivalent method called when you want to start scheduling..
{
    self.myArray = [NSArray arrayWithObjects:@"foo",@"bar",@"baz",nil];
    self.iteration = 0;

    [NSTimer scheduledTimerWithTimeInterval:3  
             target:self
             selector:@selector(fireEvent) 
             userInfo:nil 
             repeats:YES]; //Will Fire every 3 seconds...
}

-(void)fireEvent
{
     NSLog(@"%@", [self.myArray objectAtIndex:self.iteration]);
     self.iteration++;
     if (self.iteration>=self.myArray.count) self.iteration=0;
}

如果在显示阵列中的所有元素后使计时器无效。执行以下操作:

-(void)awakeFromNib //Or equivalent method called when you want to start scheduling..
{
    self.myArray = [NSArray arrayWithObjects:@"foo",@"bar",@"baz",nil];
    self.iteration = 0;

    [NSTimer scheduledTimerWithTimeInterval:3
             target:self
             selector:@selector(fireEvent:)
             userInfo:nil
             repeats:YES]; //Will Fire every 3 seconds...
}

-(void)fireEvent:(NSTimer*)timer
{
    NSLog(@">>>> %@", [self.myArray objectAtIndex:self.iteration]);
    self.iteration++;
    if (self.iteration>=self.myArray.count) {
        self.iteration=0;
        [timer invalidate];
    }
}

注意:后一个代码只添加了一个':'到@selector(fireEvent :)。并将fireEvent中的NSTimer引用作为参数读取。