使用dispatch_after做一些相对于其他事情完成的事情

时间:2014-02-28 23:00:35

标签: ios iphone objective-c

以下是我需要做的事情:

类似的东西:

for int i = 0; i < 3; i++)
call method @selector(spin) with delay 0.1

//once this is done (e.g., in 0.3 seconds)

call method @selector(move) with delay 1 second.

我需要的是在事件上堆积,并且在前一个事件结束时开始其他事件。

类似于:

wait 100ms //total time = 100ms
spin
wait 100ms //total time = 200ms
spin
wait 100ms //total time = 300ms
spin
wait 1000ms //total time = 1300ms
move

dispatch_after是否可以这样?如果是这样,有人可以举个例子吗?我似乎找不到这种情况。

注意,这些都不会导致UI线程等待/阻止。

由于

4 个答案:

答案 0 :(得分:1)

您可以使用NSThreadsleepForTimeInterval方法。以下代码将阻止正在运行的线程sleepForTimeInterval

dispatch_queue_t yourThread = dispatch_queue_create("com.xxx.queue", nil);

dispatch_async(yourThread, ^
{
     [NSThread sleepForTimeInterval:10.0];

     dispatch_async(dispatch_get_main_queue(), ^
    {

    }); 
});

这应该指向正确的方向。

答案 1 :(得分:0)

我个人认为你试图以错误的方式实现目标。处理异步处理时,应使用块

答案 2 :(得分:0)

根据您的要求:

    - (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self performSelector:@selector(move:) withObject:[NSNumber numberWithInt:0] afterDelay:2];

}

-(void) move:(NSNumber *)i {
    int val = [i intValue] + 1;

//do what you need here

    if (val < 3) [self performSelector:@selector(move:) withObject:[NSNumber numberWithInt:val] afterDelay:2];

}

但是当然如果你需要处理大量数据,请使用其他线程......

答案 3 :(得分:0)

dispatch_group_t group = dispatch_group_create();
dispatch_time_t timeNow = DISPATCH_TIME_NOW;
for (int i = 0; i < 3; ++i)
{
    dispatch_group_enter(group);
    dispatch_after(dispatch_time(timeNow, i*100), queue, ^(){
        [self spin];
        dispatch_group_leave(group);
    });
}

dispatch_group_notify(group, queue, ^(){
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1000), queue, ^(){
        [self move];
    });
});