首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS Swift -调度组,调度异步

iOS Swift -调度组,调度异步
EN

Stack Overflow用户
提问于 2017-04-20 09:26:20
回答 2查看 765关注 0票数 0

我有一个视图控制器,它有很少的文本字段和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的情况下执行此任务。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-04-20 19:49:38

您要求的是完成UIViewController中的所有任务,即使在取消它之后也是如此。这可以通过不去初始化UIViewController来实现。下面是swift中的一个示例。

代码语言:javascript
复制
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类就可以做的事情。

请让我知道你是否在寻找其他的东西,或者你对目前的解决方案有任何疑问。

票数 0
EN

Stack Overflow用户

发布于 2017-04-20 09:47:42

是否有更好的方法可以使用GCD &队列和不使用数据库来实现这一点?

根据您在项目中的设计,您可以有以下几个选项:

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43515494

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档