确保初始网络请求在发送其他请求之前完成的最佳方法(iOS应用程序)

时间:2017-02-18 11:38:25

标签: ios swift networking

我正在处理的应用程序需要在服务器上创建容器对象并将项目插入该容器中。我不想创建容器对象,直到需要插入第一个项目。但是,创建容器对象需要一些初始化,这可能需要一些时间。虽然该容器仍在初始化,但用户仍然可以发送未被处理的插入请求,因为容器还没有准备就绪。我有两个主要问题:

  1. 这应该在客户端还是服务器端处理?
  2. 处理此类问题的最佳做法是什么?
  3. 基本上,我需要在发送createContainer个请求之前完成我的初始insertItem数据任务。

    添加信息

    点击相应的insertItem即可发送tableViewCell个请求。用户点击的第一个tableViewCell会发送createContainer请求,该请求会创建一个包含第一个项目的容器。

    对于持有 n 项目的容器,请求应按以下顺序发送:

    • createContainer(Container(with: item1)
    • insertItem(item2)
    • ...
    • insertItem(item 名词 )

    第一个请求完成后,剩余的 n - 1个请求可以按任何顺序完成。

    我的想法

    听起来我希望同步处理createContainer请求,而insertItem请求应该异步处理。我不确定这是最好的方法,甚至不知道如何恰当地执行,所以任何指导都会非常感激。

2 个答案:

答案 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 即可完成任务。这是一个例子:只需创建一个简单的下载任务:

Simple Image Download Task

然后,只需将其添加到队列中。

enter image description here

您还可以在任务之间添加依赖关系,这基本上解决了您的用例。

enter image description here

希望这有帮助。