如何在iOS中检索选项卡栏控制器的子视图并将数据传递给子视图?

如何在iOS中检索选项卡栏控制器的子视图并将数据传递给子视图?,ios,cocoa-touch,cocoa,uitabbarcontroller,appdelegate,Ios,Cocoa Touch,Cocoa,Uitabbarcontroller,Appdelegate,我的应用程序依赖于一些需要远程提取的必备数据。我的tabbarcontroller的几个子视图控制器需要检索到的数据。我想将检索到的数据传递给这些视图控制器属性 我知道我可以做到以下几点: UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; UINavigationController *navigationController = [tabBa

我的应用程序依赖于一些需要远程提取的必备数据。我的tabbarcontroller的几个子视图控制器需要检索到的数据。我想将检索到的数据传递给这些视图控制器属性

我知道我可以做到以下几点:

UITabBarController *tabBarController =
        (UITabBarController *)self.window.rootViewController;

UINavigationController *navigationController =
[tabBarController viewControllers][0];

MyViewController *myViewController =[navigationController viewControllers][0];
myViewController.prop = myVal;
我的问题是如何在网络呼叫延迟的情况下处理这个问题。如果我同步执行此操作,它将阻塞用户。如果以异步方式传递数据,我不知道在应用程序委托中执行此操作是否会考虑延迟

我如何执行此工作流


是否有一种iOS最佳实践方法来完成此用例?

您可以安排在下载数据时获得回调。当你得到它时,你(在主线程上)做你想做的任何事情。例如,在我的应用程序启动时,我是如何下载和解析RSS提要的:

- (void)doRefresh:(id)sender {
    FeedFetcher* ff = [FeedFetcher new];
    ff.delegate = self;
    [ff downloadAndParseRSS];
}
现在我们正在后台线程中下载和解析,因此用户不会被阻止。当一切结束时,我是代表,因此我得到回调:

- (void) downloadAndParseRSSSucceeded:(BOOL) ok
                         receivedData:(NSMutableData*) receivedData
                           parsedData:(FPFeed*) parsedData
                                error:(NSError*)err {
    // ... get onto main thread, do something with the data
}
若“处理数据”涉及到获取对另一个视图控制器的引用并向其传递一些数据,那个么很好,并没有问题

例如,如果您使用内置的NSURLSession来执行“网络调用”,那么所有这些都可以通过可爱的代理回调(可以在主线程上)完美地协调处理

我的问题是如何在网络呼叫延迟的情况下处理这个问题。如果我同步执行此操作,它将阻塞用户

处理这些事情的一个好方法是确保您有一个明确定义的数据模型,并且所有需要访问相关数据的视图控制器都有一个对该模型的引用。然后,您可以让后台任务请求数据,并在新数据到来时更新模型。更新模型时,发布通知,告知所有感兴趣的对象(在本例中为视图控制器)模型已更改

为了使事情更加自动化,每个视图控制器都可以用来观察它所关心的模型部分,这样,只有当影响它的事情发生变化时,它才会得到通知。

您不会“异步传递数据”。您执行网络调用,异步检索信息,通知代码,如果需要将其传递给其他人,则在主线程上执行。