2

当后台任务完成时,如何在 iPhone 应用程序 IOS 程序中获得主 UI 线程的指示?

背景

  • 我正在尝试按照How to add a UIActivityIndi​​cator to a splash screen in a iphone application? 中的概念设置加载指示器?
  • 打算在 AppDelete 中使用“performSelectorInBackground”加载模型数据
  • 因此,我需要在 RootViewController 中以某种方式告诉数据何时在后台完成加载,以便它可以(a)使用数据更新 tableview 并(b)删除任何活动指示器
  • 我假设在这里做事的方法如下:
    • 在 App Delegate didFinishLaunchingWithOptions 传递模型数据加载到后台
    • AppDelegate 加载 RootViewController 并立即设置一个活动指示器
    • 一旦数据在后台加载,它必须以某种方式向 RootViewController(?这个问题的原因)表明它已经完成
    • 第二个问题可能也是当后台任务确实表明其完成时,RootviewController 如何在尝试禁用活动指示器之前检查 UI 是否已设置(带有活动指示器等)
4

2 回答 2

3

您可以使用如下方式从后台选择器回调到主线程-performSelectorOnMainThread:withObject:waithUntilDone:

- (void)loadModel
{
    // Load the model in the background
    Model *aModel = /* load from some source */;

    [self setModel:aModel];
    [self performSelectorOnMainThread:@selector(finishedLoadingModel) withObject:nil waitUntilDone:YES];
}

- (void)finishedLoadingModel
{
    // Notify your view controller that the model has been loaded
    [[self controller] modelLoaded:[self model]];
}

更新:更安全的方法是检查-finishedLoadingModel以确保您在主线程上运行:

- (void)finishedLoadingModel
{
    if (![NSThread isMainThread]) {
        [self performSelectorOnMainThread:_cmd withObject:nil waitUntilDone:YES];
    }
    // Notify your view controller that the model has been loaded
    [[self controller] modelLoaded:[self model]];
}
于 2011-11-07T01:36:45.280 回答
1

在后台完成加载后,从后台线程调用以下命令:

[self performSelectorOnMainThread:@selector(backgroundLoadingDidFinish:) withObject:nil waitUntilDone:NO];

然后-(void)backgroundLoadingDidFinish:(id)sender在你的 RootViewController 中实现。如果需要,可以在上述方法(withObject:部分)中将数据传回。

于 2011-11-07T01:39:15.330 回答