0

我有很多数据,所以我想像 FIFO 方法一样按 GCD 队列顺序上传数据。怎么做 ?

4

1 回答 1

2

无论您的“上传”块是什么,您都必须创建一个 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];
      });
});
于 2012-09-17T10:21:13.780 回答