我正在构建一个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
}
我只想顺序执行队列,前提是它不会阻塞主线程。
如果在20毫秒内从方法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
如何保持其调用顺序并同时保持顺序?
附言:-如果我删除GCD并允许事情在主线程中进行,则理论上来说它运行良好-在模拟器中。 (它在iPhone中崩溃。)
最佳答案
在这个线程中似乎有很多困惑-为了尝试减轻这种情况,让我首先说明一些有关GCD的基本事实:
如果希望同时执行多个操作,但每个操作都以可预测的顺序进行,则应为每个“事物”创建一个串行队列-这是通常维护(不锁定)关键资源的独占访问的方式-每个资源都有自己的关联串行队列。
这更有意义吗?