并发NSOperationQueue上传后跟单个任务

时间:2013-09-11 05:24:20

标签: ios objective-c queue nsoperationqueue

我正尝试执行两个步骤:

  1. 同时上传照片
  2. 用户输入然后发布内容
  3. ,这非常类似于当您添加照片"

    时Facebook应用的工作方式

    我想首先使用默认的NSOperationQueueDefaultMaxConcurrentOperationCount开始在后台上传照片。这些操作将返回我需要与第二篇文章一起发送的一些信息。

    但是,由于应用程序的性质和并发性,如何在满足以下条件的情况下以发布内容的方式构建它:

    1. 所有照片均已上传
    2. 发布内容的用户操作
    3. 可能会发生以下几种情况:

      1. 没有照片发布,用户发布内容,内容应立即发布
      2. 照片上传完整,用户发布内容,内容应立即发布
      3. 照片上传完成,用户发布内容,需要等待所有照片上传完成才能发布内容。
      4. 我想我应该创建照片上传NSOperationQueue并检查operationCount。如果它= = 0,则当用户点击UIButton时,应立即发布内容。

        但是,如果照片上传未完成,我该如何等待?我应该在伪代码中以下列方式使用waitUntilAllOperationsAreFinished

        // User taps on UIButton to post his content and this is in a ViewController
        - void postMyContent:
        {
           [self.photoUploadQ.waitUntilAllOperationsAreFinished]
        
           // Post my content now              
        }
        

        这是对的吗?我无法将第二个任务添加到photoUploadQ,因为它具有默认并发性。

        由于文档问题,我担心死锁/阻塞:

          

        调用时,此方法会阻塞当前线程,并等待接收方的当前和排队操作完成执行。当前线程被阻塞时,接收器继续启动已经排队的操作并监视正在执行的操作。在此期间,当前线程无法向队列添加操作,但其他线程可能。完成所有挂起操作后,此方法将返回。

             

        如果队列中没有操作,则此方法立即返回。

        谢谢!

1 个答案:

答案 0 :(得分:1)

一个常见的操作队列模式是创建一个操作(在您的情况下,“post content”操作),这取决于完成一系列其他操作(在您的情况下,“图像上传”操作) NSOperation方法,addDependency。这样,虽然队列可能是并发的,但这个“发布内容”操作将不会开始,直到其他“图像上传”操作完成。

您可能还希望将操作队列限制为小于NSOperationQueueDefaultMaxConcurrentOperationCount的值,因为NSURLConnection通常只允许5个左右的并发操作(如果你做的更多,那么其中一些可能最终超时)。