我的应用程序取决于需要远程提取的一些先决条件数据。我的tabbarcontroller的几个子视图控制器需要检索的数据。我想将检索到的数据传递给这些视图控制器属性。
我知道我可以做到以下几点:
UITabBarController *tabBarController =
(UITabBarController *)self.window.rootViewController;
UINavigationController *navigationController =
[tabBarController viewControllers][0];
MyViewController *myViewController =[navigationController viewControllers][0];
myViewController.prop = myVal;
我的问题是如何通过延迟网络呼叫来解决这个问题。如果我同步这样做,它将阻止用户。如果我异步传递数据,我不知道在app委托中执行此操作是否会延迟。
我怎样才能执行此工作流程?
是否有iOS最佳实践方法来完成此用例?
答案 0 :(得分:0)
您可以安排在下载数据时获得回调。当你得到它时,你(在主线程上)做任何你想做的事情。例如,以下是我在应用启动时下载和解析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内容进行“网络调用”,那么所有这些都可以通过可爱的委托回调(可以在主线程上)完美地连贯地处理。
答案 1 :(得分:0)
我的问题是如何通过延迟网络呼叫来解决这个问题。如果我同步这样做,它将阻止用户。
处理这些事情的一个好方法是确保您拥有明确定义的数据模型,并且需要访问相关数据的所有视图控制器都具有对模型的引用。然后,您可以让后台任务请求数据,并在新数据进入时更新模型。更新模型时,发布通知,告知任何感兴趣的对象(在本例中为视图控制器)模型已更改
为了使事情更加自动化,每个视图控制器都可以使用Key-Value Observing来观察它所关心的模型部分,以便只有在影响它的事物发生变化时才会收到通知。