我有两种方法:
-(void)clear
{
// some code
dispatch_async( dispatch_get_global_queue(0,0),
^{
// async_block_1
});
}
-(void)download
{
// some code
dispatch_async( dispatch_get_global_queue(0,0),
^{
// async_block_2
});
}
我需要用第三种方法打电话给他们:
-(void)relosd
{
[self clear];
[self download];
}
我如何保证首先执行async_block_1然后执行async_block_2?
很明显,以下代码不能保证:
-(void)reload
{
dispatch_sync( dispatch_get_global_queue(0,0),
^{
[self clear];
[self download];
});
}
答案 0 :(得分:3)
可以创建GCD队列以serial queue运行。
只需创建自己的队列:
dispatch_queue_t queue = dispatch_queue_create("com.my.download", NULL);
您可以执行此.m
部分,其中您声明了functie:
dispatch_queue_t getDownloadQueue() {
static dispatch_once_t onceToken;
static dispatch_queue_t ruleQueue;
dispatch_once(&onceToken, ^{
ruleQueue = dispatch_queue_create("com.my.download", NULL);
});
return ruleQueue;
}
只需将此代码放在@implementation
之外,之后您就可以执行以下操作:
-(void)clear {
// some code
dispatch_async( getDownloadQueue(), ^{
// async_block_1
});
}
-(void)download {
// some code
dispatch_async(getDownloadQueue(), ^{
// async_block_2
});
}
如果你只需要你的一个实例中的队列然后使用一个属性,这个例子将创建一个你可以在整个应用程序中使用的队列,并确保它们按顺序执行。
答案 1 :(得分:2)
你可能正在追求rckoenes的建议,但你的其他选择是。
NSOperationQueue
并设置依赖项NSOperationQueue
并设置maxConcurrentOperationCount dispatch_barrier_async
代替dispatch_async