我正在处理的应用程序需要在服务器上创建容器对象并将项目插入该容器中。我不想创建容器对象,直到需要插入第一个项目。但是,创建容器对象需要一些初始化,这可能需要一些时间。虽然该容器仍在初始化,但用户仍然可以发送未被处理的插入请求,因为容器还没有准备就绪。我有两个主要问题:
基本上,我需要在发送createContainer
个请求之前完成我的初始insertItem
数据任务。
添加信息
点击相应的insertItem
即可发送tableViewCell
个请求。用户点击的第一个tableViewCell
会发送createContainer
请求,该请求会创建一个包含第一个项目的容器。
对于持有 n 项目的容器,请求应按以下顺序发送:
createContainer(Container(with: item1)
insertItem(item2)
insertItem(item
名词 )
第一个请求完成后,剩余的 n - 1个请求可以按任何顺序完成。
我的想法
听起来我希望同步处理createContainer
请求,而insertItem
请求应该异步处理。我不确定这是最好的方法,甚至不知道如何恰当地执行,所以任何指导都会非常感激。
答案 0 :(得分:3)
您可以使用NSOperationQueue
和多个NSOperation
来实现所需的行为。 NSOperation
实例可能依赖于另一个NSOperation
实例的完成:
依赖
必须完成的操作对象数组 在当前对象开始执行之前执行。
对于您的示例,这意味着insertItem
- 操作依赖于createContainer
操作。
当您将所有这些操作添加到NSOperationQueue
时,您的createContainer
操作将首先运行。完成后,其他操作将开始运行,因为它们的依赖项现在已满足。您还可以使用maxConcurrentOperationCount
上的NSOperationQueue
来控制要同时运行的操作数。
由于您将在NSOperation
中使用异步API,因此您需要实现ConcurrentOperation
并自行处理状态更改。 API Reference非常详细地解释了这一点。
查看API Reference for NSOperation以获取更多信息。 还有一个不错的NSHipster article on NSOperations。
答案 1 :(得分:0)
添加到 NSOperationQueue 答案,有时很难手动管理NSOperation处理异步(如网络调用)所需的所有状态更改。
为简化这一点,您可以使用名为Overdrive的Swift库。它是一个了不起的库,您只需将 Task 类子类化,并在 run()函数中编写网络代码。当您完成后,只需拨打 self.finish 即可完成任务。这是一个例子:只需创建一个简单的下载任务:
然后,只需将其添加到队列中。
您还可以在任务之间添加依赖关系,这基本上解决了您的用例。
希望这有帮助。