在uitextview中显示带延迟的nsmutablearray字符串

时间:2013-01-24 19:41:35

标签: iphone ios6 nsmutablearray

我想通过添加一些延迟来更新这个UITextView的内容和这个NSMutable数组。

- (void)viewDidLoad{
 [super viewDidLoad];
myArray = [[NSMutableArray alloc]initWithObjects:@"String1",@"String2",@"String3",@"String4", @"String5",..... nil];                                                                                                                                        



int index = arc4random() % [myArray count];

myTextView.text = [myArray objectAtIndex:index];

我想在UITextView中一个接一个地显示这个NSMutable数组。

有没有办法在UITextView中显示数组有一些延迟。

请帮忙

2 个答案:

答案 0 :(得分:3)

为什么要使用计时器

执行此操作的正确方法将使用重复计时器。计时器配置为每秒重复并调用某种方法。

[NSTimer scheduledTimerWithTimeInterval:1.0
                                 target:self
                               selector:@selector(updateText:)
                               userInfo:nil
                                repeats:YES];

在(新)updateText方法中,您将生成随机数并更新文本。

- (void)updateText:(NSTimer *)theTimer {
    int index = arc4random() % [myArray count];
    myTextView.text = [myArray objectAtIndex:index];
}

这是一个几乎是自我记录的干净解决方案。


为什么不应循环并在延迟后执行。

可能可以<{1}}或performSelector:withObject:afterDelay:执行此操作,但这很容易出错,实际的工作解决方案更复杂,更难实现理解。

如果你认为你可以循环一定次数并在内部调用其中任何一个,那么你会看到一些有趣的东西。这两种方法都是异步的,不会等待调用调用。他们只是将它安排在“现在”的指定时间内发生。

循环和调用异步方法的作用

dispatch_after()

你可以想象,结果是一秒钟什么也不会发生。然后所有预定的呼叫将立即发生。

这实际上等于在一秒钟后执行整个循环。

Loop 
 0    |----- 1s wait -----| |update|
 1     |----- 1s wait -----| |update|
 2      |----- 1s wait -----| |update|
 3       |----- 1s wait -----| |update|
    ...
 ----------- time --------------------->

如果你在每次更新后安排下一个电话

,你可以使这个工作
 |----- 1s wait -----| Loop:
                         0  |update|
                         1   |update|
                         2    |update|
                         3     |update|
                            ...
 ----------- time --------------------->

为此,您必须安排上一次更新中的下一次更新。

 |----- 1s wait -----| |update| |----- 1s wait -----| |update| ...
 ----------- time --------------------->

这与重复计时器完全相同但有两个主要缺点。

1)不太直观。

在计时器示例中,您只需阅读计时器代码即可了解文本每秒都会更新。在这种情况下,您只需拨打- (void)updateText { int index = arc4random() % [myArray count]; myTextView.text = [myArray objectAtIndex:index]; [self performSelector:@selector(updateText) withObject:nil afterDelay:1.0]; } 即可。通过阅读该代码而不查看updateText的实现这是一个重复的过程是不直观的。

2)如果你想让它停止,它会变得更加复杂。

您可以保留指向updateText的指针,只需拨打NSTimer即可停止指针。使用[myTimer invalidate];performSelector:...的代码尚不支持它,如果它是为了支持它而构建的,那将更复杂,更不直观。

答案 1 :(得分:2)

很少有办法,根据我的偏好进行排名:

1 ..您可以使用:

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

2 .. Grand Central Dispatch也将为您服务。