我有很多数据,所以我想像 FIFO 方法一样按 GCD 队列顺序上传数据。怎么做 ?
1 回答
无论您的“上传”块是什么,您都必须创建一个 GCD 串行队列,然后在其上 dispatch_async 所有上传块。
创建队列:
dispatch_queue_t myFifoQueue = dispatch_queue_create("com.example.myfifoqueue",DISPATCH_QUEUE_SERIAL);
创建队列后,您现在可以分派上传块。要调度队列中的这些块之一:
dispatch_async(myFifoQueue,myUploadBlock);
“dispatch_async”保证您的块将被添加到串行队列中,但您当前的线程(通常是主线程)不会等待块完成。使用串行队列可确保所有块都以 FIFO 顺序执行。
例如,如果你有一个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];
});
});