iOS Swift - 调度组,异步调度

iOS Swift - Dispatch Group, dispatch async

我有一个视图控制器,它有几个文本字段和 4 个按钮代表 4 张照片,用户将单击这些照片以选择要上传到服务器的照片,还有一个保存按钮。选择照片后,我使用 dispatch_async 将照片上传到服务器并返回 URL 然后我使用 URL 和文本字段中的其他信息来调用另一个 API 并在用户单击“保存”按钮时将所有内容上传到服务器。

对于这种情况:如果我点击保存按钮但照片还没有上传到服务器,我可以使用 DispatchGroup 通知所有照片何时上传,我可以在等待和完成时显示进度 hud,我将调用另一个 API 将所有数据提交到服务器并弹出当前视图控制器。

但我有一个要求,当用户点击保存按钮时,视图控制器必须立即弹出,所有那些 API 调用应该在后台 运行。我能想到的解决方案是当用户单击“保存”按钮时,我会将所有文本字段信息保存到数据库(Core Data 或 UserDefaults)。因为我使用PhotoUploading单例class上传照片到服务器,所以当服务器returns URLs的照片,我会用那个单例来保存这些URLs也到数据库并调用 API 方法将所有数据提交到服务器。但是这样一来,我不得不将不相关的作品放入 PhotoUploading class.

有没有更好的方法可以使用 GCD 和队列而不使用数据库来做到这一点?我想要存档的是使用 GCD 在后台处理此视图控制器中的所有内容。诸如等待上传任务完成然后执行此任务而不阻塞 UI

Is there any better way to do this using GCD & queues and without using database?

根据项目中的设计,您可以有两种选择:

  • 使用 delegate 并通过它传递文本文件的数据
  • Post一个NSNotification

就我个人而言,我不会为此创建数据库

您要求的是 UIViewController 中的所有任务,即使在解雇后也是如此。这可以通过不取消初始化 UIViewController 来实现。下面以swift.

为例
var viewController: ViewController?

func launchVC() {

    viewController = ViewController()
    self.present(viewController!, animated: true, completion: nil)
}

func dismissVC() {

    if let view_controller = self.viewController {
        view_controller.dismiss(animated: true, completion: nil)
    }
}

func killVC() {

    viewController = nil
}

正如您在上面看到的,即使在解雇 ViewController 之后,ViewController 仍然存在。因此,无论您在那个特定 ViewController 的后台线程中启动什么任务,都将完成。完成后,您可以销毁 ViewController 对象。

这是您可以在不使用任何外部设备的情况下完成的事情 Singleton class。

如果您正在寻找其他东西或对当前解决方案有任何疑问,请告诉我