我有一个视图控制器,它有很少的文本字段和4个按钮代表4张照片,用户将点击这些照片来选择上传到服务器的照片,还有一个保存按钮。在选择了一张照片后,我使用dispatch_async将照片上传到服务器并获得返回的URL,并使用该URL与文本字段中的其他信息一起调用另一个API,并在用户单击Save按钮时将所有这些信息上传到服务器。
对于本例:如果单击Save按钮但照片尚未上载到服务器,则可以使用DispatchGroup通知所有照片何时上载,并且可以在等待和完成时显示进度hud,然后调用另一个API向服务器提交所有数据,并弹出当前视图控制器。
但是我有一个要求,当用户单击Save按钮时,视图控制器必须立即弹出,所有这些API调用都应该在后台运行。我能想到的解决方案是,当用户单击Save按钮时,我将将所有textfields信息保存到数据库(Core或UserDefaults)中。因为我使用一个PhotoUploading单例类将照片上传到服务器,所以当服务器返回照片的URL时,我将使用该单例将这些URL保存到数据库中,并调用API方法将所有数据提交给服务器。但是,通过这样做,我必须为PhotoUploading类放置无关的工作。
是否有更好的方法可以使用GCD &队列和不使用数据库来实现这一点?我想存档的是使用GCD在后台处理此视图控制器中的所有内容。类似于等待上传任务完成,然后在不阻塞UI的情况下执行此任务。
发布于 2017-04-20 19:49:38
您要求的是完成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类就可以做的事情。
请让我知道你是否在寻找其他的东西,或者你对目前的解决方案有任何疑问。
发布于 2017-04-20 09:47:42
是否有更好的方法可以使用GCD &队列和不使用数据库来实现这一点?
根据您在项目中的设计,您可以有以下几个选项:
delegate并通过它传递文本文件的数据NSNotification就我个人而言,我不会为此创建数据库
https://stackoverflow.com/questions/43515494
复制相似问题