ios swift parse:具有异步结果的方法

时间:2015-02-27 09:37:38

标签: ios swift asynchronous

当我转到viewController时,我在viewDidAppear方法中调用了一个函数:

override func viewDidAppear(animated: Bool) {
    getLessons()
}

此方法从parse.com加载我想在pickerView中使用的数据列表。 功能本身:

func getLessons(){
        var query = PFQuery(className:"Lesson")
        query.orderByAscending("name")
        query.findObjectsInBackgroundWithBlock {
            (objects: [AnyObject]!, error: NSError!) -> Void in
            if error == nil {

                for object in objects {

                    var name = object["name"] as String

                    self.languagePickerKeys.append(object.objectId)
                    self.languagePickerValues.append(name)

                    self.selectedLanguage.text = self.languagePickerValues.first // set the first lessons name into the text field
                    self.selectedLessonObjectId = self.languagePickerKeys.first // set the first objectId for the lesson

                    self.languagePicker?.reloadAllComponents()

                }
            } else {
                // Log details of the failure
                println("\(error.userInfo)")
            }
        }
        println("getLessons done")
    }

问题是,textfield为空,因为getLesson()获取数据异步并且数据不可用于文本字段。

我也尝试将getLesson放入viewDidAppear方法,但这对我没有帮助,无论如何,textfield都是空的。

我可以做什么,让getLessons()方法的数据准备就绪,并在向用户显示视图时将其第一个值加载到我的文本字段中?

3 个答案:

答案 0 :(得分:12)

在将其设置为pickerView之前,您必须从asyncTask获取数据。

这是实例化后的ViewController生命周期:

  • 如果被诱惑准备。
  • 插座设置
  • 出现和消失。

所以,你有两个选择:

  1. 在先前的ViewController中加载数据,然后执行segue。您需要按照以下步骤操作。

    一个。从之前的ViewController创建一个segue到ViewController。

    湾如果你想进入下一个获取数据的ViewController,并在结束(获取数据之后)调用将导致你的ViewController的performSegueWithIdentifier,则调用该函数。

    ℃。在prepareForSegue

    中设置数据
    let navigationController = segue.destinationViewController as UINavigationController
    
    navigationController.data = yourData //you got from async call
    
  2. 现在,当您到达ViewController时,您确定您的数据存在,并且您可以将其设置为pickerView。

    1. 如果你想在同一个ViewController中执行它:这里是ViewController的lifeCycle:life Cycle所以你需要在viewDidLoad中调用你的函数,并且在完成异步后总是设置你的pickerView网络电话。

答案 1 :(得分:0)

确保您从主线程启动对UI的所有更改,例如像这样:

dispatch_async(dispatch_get_main_queue(), {
    selectedLanguage.text = languagePickerValues.first
    self.languagePicker?.reloadAllComponents()    
})

答案 2 :(得分:0)

问题是findObjectsInBackgroundWithBlock是一个异步方法,所以即使你在ViewDidLoad中触发它,你也永远不知道什么时候会收到响应数据,而你无法确定数据是否准备就绪视图出现。

我认为你只有两种可能性: 第一个是在先前的视图控制器中加载数据,然后将准备好的数据传递给您查看控制器。

第二种是使用同步方法(可能是findobject方法?)并将调用放在视图出现之前触发的方法中(如viewWillAppear:方法)。但是,当数据正在检索时,您的视图会停留片刻(我认为)......但是,第二种解决方案可能解决您的问题,但使用同步方法从较慢的数据源检索数据通常是糟糕的设计解决方案。

d