我有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
我该怎么做?
答案 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引用作为参数读取。