在更新UI之前,请等待Parse查询完成

时间:2014-10-26 18:05:32

标签: ios objective-c uiviewcontroller while-loop singleton

首先,我正在使用Storyboards,Parse后端和objective-c(IOS8项目)

我有一个ViewController从当前打开的行下载特定列。我在这个ViewController中也有一个发送新查询的容器,但该查询需要来自VC1的列值。由于在容器启动之前没有下载,因此在尝试与(null)进行比较时会抛出异常。

同样如此:(在VC1完成下载之前,valueFromMainVC为空)

[query whereKey:@"MyColumn" equalTo:valueFromMainVC];

这发生在 - (PFQuery *)queryForTable方法

-(PFQuery *)queryForTable {
}

我该如何解决这个问题?我尝试使用while(){}语句,以便在下载valueFromMainVC之前不会开始,但我没有取得任何成功。

(我使用Singleton在ViewControllers之间共享valueFromMainVC。以及其他值)

非常感谢帮助!

谢谢! 埃里克

2 个答案:

答案 0 :(得分:0)

之前我没有使用过Parse,所以我的回答是一般性的。您可能想要编辑您的问题并在标题中添加“Parse”:“等待Parse查询在更新UI之前完成”或类似的东西。 (那样具有Parse经验的人会看到它并且更有可能打开你的问题)

库有多种方法可用于处理异步代码。

几乎所有这些都涉及到你的想法。您不会编写在循环中等待发生某些事情的代码。相反,您会显示某种占位符,向用户返回控制权,并且库会在读取数据时通知您。

有一种方式是脱离时尚,以在库中定义委托属性。一旦读取数据,库就会使用特定协议向代理发送消息

处理此问题的另一种方法是使用通知中心(NSNotificationCenter)。您为特定消息添加了一个观察者,一旦数据准备好,库就会发送一个特定的通知。

新代码的第三种也是最常见的方法是在库中调用一个完成块的方法。完成块是在数据可用之前不会执行的代码。您将UI设置为显示占位符,并且您传递的代码块会在数据可用时更新UI。

答案 1 :(得分:0)

我现在在一些项目中使用了Parse,并且使用@Duncan提到的策略三我取得了很好的成功。我将等待第一个VC加载,然后使用完成块调用Parse查询以更新列值,然后在成功查询的完成块中加载子视图。这样可以防止在完成数据查询之后加载子VC。希望这有帮助!

- (void)viewDidLoad {
  self.functionToLoadData();
}

-(void)functionToLoadData {
    PFQuery *query = [PFQuery queryWithClassName:@"invites"];
    [query whereKey:@"MyColumn" equalTo:valueFromMainVC];
    [query findObjectsInBackgroundWithBlock:^(NSArray *objects, NSError *error){
        if (error) {
            NSLog(@"Error retrieving objects");
        } else {
            // Update necessary variables/fields and load your child view as necessary
        }
    }];
}