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。
如果您正在寻找其他东西或对当前解决方案有任何疑问,请告诉我
我有一个视图控制器,它有几个文本字段和 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。
如果您正在寻找其他东西或对当前解决方案有任何疑问,请告诉我