【发布时间】:2012-09-17 07:17:05
【问题描述】:
我有很多数据,所以我想像 FIFO 方法一样按 GCD 队列顺序上传数据。该怎么做?
【问题讨论】:
标签: iphone ios5 upload grand-central-dispatch
我有很多数据,所以我想像 FIFO 方法一样按 GCD 队列顺序上传数据。该怎么做?
【问题讨论】:
标签: iphone ios5 upload grand-central-dispatch
无论您的“上传”块是什么,您都必须创建一个 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];
});
});
【讨论】: