【问题标题】:Wait for Parse query to complete before updating UI在更新 UI 之前等待 Parse 查询完成
【发布时间】:2014-10-26 18:05:31
【问题描述】:

首先,我使用 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。以及其他值)

非常感谢您的帮助!

谢谢! 埃里克

【问题讨论】:

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


    【解决方案1】:

    我现在在几个项目中使用 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
            }
        }];
    }
    

    【讨论】:

    • 不确定我是否理解。我在一个容器内有一个带有子 VC 的 VC,一旦父 VC 加载,该容器就会加载。然后,它会尝试与下载前应用程序中尚不存在的内容进行比较。您能否详细说明您的意思以及这将如何工作?我想到的一种解决方案是根据请求以某种方式在容器上调用 viewDidLoad(这将在 valueFromMainVC 下载的完成块中调用),而不是立即启动容器
    • 抱歉给您带来了困惑,如果我仍然没有正确理解,请告诉我。假设我上面提供的代码在您的第一个 VC 中运行,我提供的函数会查询原始 VC 所需的数据,并且在该数据查询完成并成功返回之前它不会启动子 VC。您可以将启动子 VC 的代码放在我的代码中的 else 语句中。
    • 没问题;) 现在我明白你的意思了,我也是这么想的。如何根据请求而不是立即“启动”容器?
    • 酷。抱歉,我所说的启动是指以编程方式呈现视图控制器。我知道您说您正在使用情节提要,所以我会查看另一个问题,其中详细说明了如何使用和不使用情节提要。我相信我过去已经成功使用过这个stackoverflow.com/a/16134703/2292725
    • 但如果我这样呈现,它会占据整个屏幕,就像任何其他模态转场一样。如何控制 VC 所在的 containerView 的行为?这样它将显示为控件而不是全屏 ViewController
    【解决方案2】:

    我以前没有使用过 Parse,所以我的回答是笼统的。您可能想要编辑您的问题并将“解析”放在标题中:“在更新 UI 之前等待解析查询完成”或类似内容。 (这样有 Parse 经验的人会看到它并更有可能提出您的问题)

    库可以使用多种方式来处理异步代码。

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

    有点过时的一种方法是在库中定义委托属性。读取数据后,库会使用特定协议向委托发送消息

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多