2

我怎样才能得到一个指示,主UI线程在一个iPhone应用程序IOS,当后台任务已完成?如何在后台任务完成时向主UI线程指示? (performSelectorInBackground)

背景

  • 我想设置每个概念的负荷指标为How to add a UIActivityIndicator to a splash screen in a iphone application?
  • 打算在APPDELETE使用“performSelectorInBackground”来加载模型数据
  • 我因而需要在RootViewController的当数据在后台加载完成,以便它可以(一)更新的数据的tableview及(b)清除任何活动指标
  • 我假设的方式在这里做的事情告诉的一些方法一世S作为如下:
    • 中应用代表didFinishLaunchingWithOptions通脱模型数据加载到背景
    • 的AppDelegate负载可达RootViewController的和它立即设置了一个活动的指标
    • 一旦数据在背景加载,它在某种程度上必须指示这回到RootViewController(?原因这个问题),它的完成
    • 第二个问题大概也是当后台任务也inidicate其完成,怎么能RootViewController的检查UI没有得到安装(与活动的指标等)之前,它试图禁用活动的指标

回答

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]]; 
} 
+0

感谢 - 任何评论重新如何确保当“modelLoaded”之称,主线程已经得到了足够远,沿着室内用展示活动指标的UI?即如何处理潜在的“modelLoaded”方法试图隐藏活动指示器时可能尚未设置/显示的问题? – Greg

+0

只要你在主线程上显示和隐藏活动指示器,你应该没问题。你应该遵循的基本工作流程是:1)显示活动指标; 2)启动你的后台线程; 3)完成并返回主线程后,隐藏活动指示器。 –

+0

行 - 所以我可能不得不重新审视我的订单 - 我的背景模型加载正在拉开序幕中的AppDelegate中:didFinishLaunchingWithOptions,与活动的指标正在拉开序幕作为RootViewController的的viewDidLoad – Greg

1

一旦你在后台加载完成后,请从你的后台线程如下:

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

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

+0

感谢StuDev - 请记住,如果我问你如何确保在调用“modelLoaded”时,主线程已经足够显示用户界面的活动指示器了?即如何处理潜在的“modelLoaded”方法试图隐藏活动指示器时可能尚未设置/显示的问题? – Greg

+0

@Greg:我认为卡梅隆在他们的回答下的评论涵盖了你的要求 - 先加载你的指标,然后开始在后台加载数据。无论如何,在隐藏它之前,你总是可以检查活动指示符的存在,并记住调用'nil'上的'removeFromSuperview'(即如果你的活动指示符还不存在)是完全有效的,没有什么不好的发生。 – Stuart

+0

感谢StuDev - 关于“在nil上调用removeFromSuperview是有效的” – Greg

相关问题