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

Posted

技术标签:

【中文标题】如何在 iOS 中检索数据并将数据传递给标签栏控制器的子视图?【英文标题】:How to retrieve and pass data to child views of a tab bar controller in iOS? 【发布时间】:2014-02-03 17:32:19 【问题描述】:

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

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

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

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

MyViewController *myViewController =[navigationController viewControllers][0];
myViewController.prop = myVal;

我的问题是如何处理网络呼叫的延迟。如果我同步执行此操作,它将阻止用户。如果我异步传递数据,我不知道在应用程序委托中执行的这是否会尊重延迟。

我该如何执行这个工作流程?

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

【问题讨论】:

您不会“异步传递数据”。您进行网络调用,异步检索信息,通知您的代码,如果您需要将其传递给其他人,您可以在主线程上进行。 【参考方案1】:

您安排在下载数据时获得回调。当你得到它时,你(在主线程上)做任何你想做的事情。例如,以下是我在应用启动时下载和解析 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 进行“网络调用”,那么所有这些都可以通过可爱的委托回调(可以在主线程上)完美地为您处理。

【讨论】:

【参考方案2】:

我的问题是如何处理网络呼叫的延迟。如果我同步执行此操作,它将阻止用户。

处理这些事情的一个好方法是确保您有一个明确定义的数据模型,并且所有需要访问相关数据的视图控制器都具有对该模型的引用。然后你可以有一个后台任务请求数据并在新数据进入时更新模型。当模型更新时,发布一个通知,告诉任何感兴趣的对象(在这种情况下,你的视图控制器)模型已经改变.

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

【讨论】:

以上是关于如何在 iOS 中检索数据并将数据传递给标签栏控制器的子视图?的主要内容,如果未能解决你的问题,请参考以下文章

从数据库加载用户特定设置和站点设置并将数据传递给视图和控制器

如何从调用方法didSelectRowAtIndexPath将数据传递给ios应用程序中的子视图控制器

将信用卡数据传递给控制器

单击注释时,如何将数据传递给其视图控制器?

如何正确使用文件映射并将数据传递给子进程?

提交表单并将数据传递给 FileStreamResult 类型的控制器方法