3

我正在尝试执行一个两步过程:

  1. 并发上传照片
  2. 用户输入然后发布内容

,这与“添加照片”时 facebook 应用程序的工作方式非常相似

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

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

  1. 所有照片已上传
  2. 用户发布其内容的操作

可能会发生几种情况:

  1. 没有照片要发布,用户发布内容,内容应该立即发布
  2. 照片上传完成,用户发布内容,内容应立即发布
  3. 照片上传完成,用户发布内容,需要等待所有照片上传完成后才能发布内容。

我想我应该创建一个照片上传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因为它具有默认并发性。

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

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

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

谢谢!

4

1 回答 1

1

一个常见的操作队列模式是创建一个操作(在您的情况下是“发布内容”操作),该操作依赖于使用该方法完成的一系列其他操作(在您的情况下是“图像上传”操作)NSOperationaddDependency. 这样,虽然队列可能是并发的,但在完成其他“图像上传”操作之前,该“发布内容”操作不会开始。

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

于 2013-09-11T06:17:16.090 回答