在實(shí)際開(kāi)發(fā)過(guò)程中,有時(shí)候需要設(shè)置任務(wù)之間的依賴關(guān)系,iOS主要有兩種方案,一種是基于GCD,另一種是基于NSOperation,下面分別介紹。
/**任務(wù)1,2并行執(zhí)行,執(zhí)行完后任務(wù)3執(zhí)行*/
1.基于GCD的實(shí)現(xiàn)方案
/**方法1*/
[objc]view plaincopy
dispatch_group_t?group?=dispatch_group_create();
dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),?^{
NSLog(@"任務(wù)1");
});
dispatch_group_async(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),?^{
NSLog(@"任務(wù)2");
});
dispatch_group_notify(group,dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),?^{
NSLog(@"任務(wù)3");
});
/*方法2*/
/*
*dispatch_barrier_async會(huì)等待當(dāng)前隊(duì)列的任務(wù)執(zhí)行完之后再執(zhí)行dispatch_barrier_async(myqueue, ^{
NSLog(@"任務(wù)3");
});中定義的任務(wù),該任務(wù)執(zhí)行完成后,會(huì)繼續(xù)執(zhí)行隊(duì)列后面的任務(wù)。
*/
[objc]view plaincopy
dispatch_queue_t?myqueue?=dispatch_queue_create("myqueue.queue",DISPATCH_QUEUE_CONCURRENT);
dispatch_async(myqueue,?^{
NSLog(@"任務(wù)1");
});
dispatch_async(myqueue,?^{
NSLog(@"任務(wù)2");
});
dispatch_barrier_async(myqueue,?^{
NSLog(@"任務(wù)3");
});
dispatch_async(myqueue,?^{
NSLog(@"任務(wù)4");
});
dispatch_async(myqueue,?^{
NSLog(@"任務(wù)5");
});
任務(wù)1,2并行執(zhí)行,執(zhí)行完后任務(wù)3執(zhí)行,執(zhí)行完后任務(wù)4,5并行執(zhí)行。
2.基于NSOPeration實(shí)現(xiàn)
[objc]view plaincopy
NSBlockOperation*opration1=?[NSBlockOperationblockOperationWithBlock:^{
NSLog(@"任務(wù)1");
}];
NSBlockOperation*opration2=?[NSBlockOperationblockOperationWithBlock:^{
NSLog(@"任務(wù)2");
}];
NSOperationQueue*operationQueue?=?[[NSOperationQueuealloc]init];
[operationQueueaddOperation:opration1];
[operationQueueaddOperation:opration2];
NSBlockOperation*opration3=?[NSBlockOperationblockOperationWithBlock:^{
NSLog(@"任務(wù)3");
}];
[opration3addDependency:opration1];
[opration3addDependency:opration2];
[operationQueueaddOperation:opration3];