我对iOS开发很陌生,并且已经在一段时间内完成了任务。决定最终寻求帮助。
在让应用程序启动之前,我有一些数据要从互联网上加载。我决定在didFinishLaunchingWithOptions
AppDelegate
它是:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
//loading configuration
[Configuration downloadConfiguration:^(NSMutableArray *currencies, double refreshIntervalInMilis, double timeDifferenceInMilis, NSError *error) {
if (error) {
//displaying error dialog
} else {
//doing some stuff with data loaded
}
}];
return YES;
}
很明显,在加载数据之前,该方法将返回YES,因为它不会等待加载数据。我的问题是如何在返回YES 之前使此方法等待此块完成(如果配置未正确加载,则为NO)?
答案 0 :(得分:5)
在返回YES
之前,不要等待数据下载。如果应用程序尚未在30秒内启动,则iOS具有杀死应用程序的监视程序守护程序。因此,如果您的用户网络连接非常糟糕导致下载超过30秒 - 您的应用程序将在开始之前被杀死。
我的建议是使用通知来通知所需方的配置下载。安装程序需要列出的根视图控制器,例如MYApplicationDidDownloadConfigurationNotification
,一旦收到通知,它就会重新加载UI或推送一些依赖于相关配置的其他视图控制器。
如果下载失败 - 更新UI而不是从委托方法返回NO
。在您的所有应用程序启动后,只是没有运气下载配置。
答案 1 :(得分:1)
永远不要等待主线程上的网络访问。只需添加代码即可将返回数据的其余应用程序初始化为downloadConfiguration:
的回调块
答案 2 :(得分:1)
我的建议是添加一个启动画面,显示它正在加载进度条。进度条表示您正在等待下载数据,完成后,您可以显示下一个屏幕。所以在appdelegate.h中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
self.splashviewController = [[SplashViewController alloc] init];
navigationController = [[NavigationController alloc] initWithRootViewController:self.splashviewController];
self.window.rootViewController = navigationController;
[self.window makeKeyAndVisible];
return YES;
}
在您的splashview控制器中,包含您的代码:
[Configuration downloadConfiguration:^(NSMutableArray *currencies, double refreshIntervalInMilis, double timeDifferenceInMilis, NSError *error) {
if (error) {
//displaying error dialog
} else {
//doing some stuff with data loaded
}
}];
答案 3 :(得分:-1)