我正在构建一个 iOS 应用程序,它在后台线程上做了一些繁重的工作。
我使用创建我的线程
dispatch_queue_t backgroundQueue;
backgroundQueue = dispatch_queue_create("MyQueue", NULL);
然后使用以下命令将其放入 GCD:
dispatch_async(backgroundQueue, ^
{
//some heavy operations here
//each of them might run for >1 sec
}
我只想要队列的顺序执行,只要它不阻塞主线程。如果在 20ms 内从方法 3、方法 2 和方法 1 调用此块......它们必须按照 3 -> 2 -> 1 的顺序执行,因为每个方法的输出都会被下一个用完。
我是 GCD 的新手,天真地认为调度队列会使用 FIFO 队列来执行顺序调用。然而,在其当前的实现中,它远非顺序。
我尝试使用 NSLock,但它们也没有帮助。
我想知道在 GCD 中强制执行顺序执行的正确机制。
编辑1:
我声明一个全局队列:
dispatch_queue_t backgroundQueue ;
并在 viewDidLoad() 中启动它:
backgroundQueue = dispatch_queue_create("MyQueue", DISPATCH_QUEUE_SERIAL);
//using DISPATCH_QUEUE_SERIAL was a new idea, I also tried using NULL
我正在使用 GCD 基本上调用另一个类中的方法:
-(void)doAction()
{
dispatch_async(backgroundQueue, ^
{
MyOtherClass *obj = [[MyOtherClass alloc] init];
[obj heavyMethod1: param1 : param2];
[obj release];
});
}
-(void)doAnotherAction()
{
dispatch_async(backgroundQueue, ^
{
MyOtherClass *obj = [[MyOtherClass alloc] init];
[obj heavyMethod2: param3 : param4];
[obj release];
});
}
现在,doAction 和 doAnotherAction 方法被许多其他方法调用,具体取决于场景。
我在这里看到的是 - 如果我按顺序调用这些方法 :: doAction -> doAction -> doAnotherAction -> doAction
...我按如下顺序获得输出: :: doAction -> doAnotherAction -> doAction -> doAction
如何保持其调用顺序并同时保持其连续性?
PS: - 如果我删除 GCD 并允许在主线程中进行,理论上它运行良好 - 在模拟器中。(它在 iPhone 中崩溃。)