dispatch_async超时方法调用

在完成下面列出的漫长过程之后,是否有一个在设定的时间限制之后调用外部方法的好方法? 我想要一个漫长的过程,在设定的时间间隔后停止尝试,并调用一个方法来尝试别的东西,并结束请求。

dispatch_async(dispatch_get_global_queue(0, 0), ^{ //// LONG PROCESS dispatch_async(dispatch_get_main_queue(), ^{ //// RESULTS PROCESS }); }); 

为了“杀死”正在运行你的块的进程,你必须检查一个条件。 这将允许你做清理。 考虑以下修改:

 dispatch_async(dispatch_get_global_queue(0, 0), ^{ BOOL finished = NO; __block BOOL cancelled = NO; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 5.0 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{ if (!finished) { cancelled = YES; } }); void (^cleanup)() = ^{ // CLEANUP }; //// LONG PROCESS PORTION #1 if (cancelled) { cleanup(); return; } //// LONG PROCESS PORTION #2 if (cancelled) { cleanup(); return; } // etc. finished = YES; dispatch_async(dispatch_get_main_queue(), ^{ //// RESULTS PROCESS }); }); 

////Long Process ,当完成时将布尔值(如BOOL finished )更改为true 。 在调用dispatch_async(...)之后,在这里input:add this:

 int64_t delay = 20.0; // In seconds dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, delay * NSEC_PER_SEC); dispatch_after(time, dispatch_get_main_queue(), ^(void){ if (!finished) { //// Stop process and timeout } }); 

这样,在20秒(或任何你想要的时间)之后,你可以检查过程是否还在加载并采取一些规定。

我已经使用这个方法的Swift:

 let delay = 0.33 * Double(NSEC_PER_SEC) let time = dispatch_time(DISPATCH_TIME_NOW, Int64(delay)) dispatch_after(time, dispatch_get_main_queue()) { //// RESULTS PROCESS }