【问题标题】:Show a loading animation with swift while waiting for the data from Parse在等待来自 Parse 的数据时快速显示加载动画
【发布时间】:2015-04-11 09:32:02
【问题描述】:

我在这里浏览了许多问答,但几乎所有问答都对其他人的用例过于具体。

我的情况比较笼统,也比较简单:

iOS\Swift

我有一个按钮,单击该按钮 - 将用户移动到下一个视图。 在单击按钮的同时,它还会执行 Parse 查询以获取将在下一个视图中显示的数据。

我正在使用 Parse 的异步 query.getObjectInBackgroundWithId("jjjkkkdddd")

因此,如果我的代码按原样运行 = 单击 -> 移至下一个视图 -> 为空 因为取东西需要一秒钟左右的时间。

我想要的是当用户单击一个按钮时弹出一个小动画,告诉他们当前正在获取数据,并在数据到达后移动到下一个视图。

这是我的按钮点击代码:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

if (segue.identifier == "1") {

     var svc = segue.destinationViewController as ViewControllerQuotes;

     svc.toPass = functionToFetchDataFromParse() //<- takes longer than    
                                                //switching to the next view
     //toPass is a var which lands into the next view 
     //and it's value is displayed to the user.

   }
}

我对 Swift 和 iOS 开发非常陌生,所以我仍然无法弄清楚这一点:(

【问题讨论】:

  • 用 PFObjects 而不是用 ID 处理对象,这让事情变得更容易..顺便说一句:为什么不投票?
  • 我没有投反对票!是的,PFObjects 更好——这个代码现在是一个测试,用于建立一个工作“骨架”来获取数据并显示它。那我就重做吧。

标签: ios multithreading swift asynchronous parse-platform


【解决方案1】:

点击按钮,只需使用addSubview() 即可添加一个UI 元素,例如UIActivityIndicatorView
在 Parse 的回调中,移除视图并转到下一个控制器,以编程方式调用 segue。

【讨论】:

  • 不完全确定如何进行。我已经编辑了我的问题,添加了整个事情发生的确切时刻\代码以及获取数据的延迟。您的建议如何融入其中?
  • 请阅读答案。您应该在按下按钮时获取数据,而不是在prepareForSegue 中。您可以从成功回调中手动调用 segue(使用 performSegueWithIdentifier)。来自您的 OP:“当数据到达时移动到下一个视图。”
【解决方案2】:

我的解决方案:

好吧,我摆弄了一下,找到了最适合我的方式。我所做的是从 View1 按下按钮,它告诉第二个视图的视图控制器启动数据获取功能。

在 2-nd vie 控制器中,一旦触发异步功能以从 Parse 检索数据,它还会显示活动指示器并使其运行。

用户看到一个空白屏幕,其中正在运行一个活动微调器。一旦异步函数取回数据,它会将其推入一个空标签并关闭+隐藏活动指示器。

非常适合我的情况。没有接口挂。并让用户清楚地了解何时何地发生了什么。

谢谢大家!

附言这对我有用,因为这是检索数据生命周期的结束。如果还有其他依赖于它的功能 - 这将不起作用:(

【讨论】:

    【解决方案3】:

    如何在 segue 的目标 View 控制器上设置对象,然后获取对象,然后重新加载视图?

    这将是:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
    
       if (segue.identifier == "1") {
    
         var svc = segue.destinationViewController as ViewControllerQuotes;
    
         svc.yourObjectWhichIsToFetch = yourObjectWhichYouWantToPass //need to create a variable on the ViewControllerQuotes!
       }
    }
    

    然后在 ViewControllerQuotes 类中:

    class ViewControllerQuotes:ViewController {
        var yourObjectWhichIsToFetch:PFObject?
    
        override func viewDidLoad(){
            super.viewDidLoad()
    
            yourObjectWhichIsToFetch.fetchInBackgroundWithBlock({
                (object, error) -> Void in
                if error == nil {
                    //update the UI
                }
            })
        }
    }
    

    使用此代码,您无需显示任何加载说明(真的很难看)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-18
      • 1970-01-01
      相关资源
      最近更新 更多