以下是我需要做的事情:
类似的东西:
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线程等待/阻止。
由于
答案 0 :(得分:1)
您可以使用NSThread
的sleepForTimeInterval
方法。以下代码将阻止正在运行的线程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];
});
});