我有很多数据,所以我想按照FIFO方法上传GCD队列顺序中的数据。怎么做?
答案 0 :(得分:2)
无论您的“上传”块是什么,您都必须创建一个GCD串行队列,然后在其上调度所有上传块。
创建队列:
dispatch_queue_t myFifoQueue = dispatch_queue_create("com.example.myfifoqueue",DISPATCH_QUEUE_SERIAL);
创建队列后,您现在可以调度上传块。 要在队列中分配其中一个块:
dispatch_async(myFifoQueue,myUploadBlock);
“dispatch_async”保证您的块将被添加到串行队列中,但您当前的线程(通常是主线程)将不会等待块完成。 使用串行队列可确保所有块都按FIFO顺序执行。
E.g。如果您有一个NSArray *myArray
并且想要使用名为-(void)processObject:(id)object
的方法在队列中处理数组对象,那么您可以用这种方式编写代码:
for(id object in myArray) {
dispatch_async(myFifoQueue,^{
[self processObject:object];
}
);
}
基本上你在这里做的是枚举数组中的所有对象,然后向串行队列提交一个调用“processObject:”方法的简单块。无论processObject完成任务所花费的时间是什么,dispatch_async将立即返回,并且串行队列将在后台线程中串行处理其块。 请注意,这里没有办法知道所有块何时完成,因此最好在队列末尾提交一些块,通知队列末尾的主线程(这样你就可以了)更新你的用户界面):
dispatch_async(myFifoQueue,^{
dispatch_async(dispatch_get_main_queue(),
^{
[self endOfUpload];
});
});