等待在app启动时加载数据

时间:2013-03-11 14:02:59

标签: ios

我对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)?

4 个答案:

答案 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)

您是从REST API下载的吗?

如果是,请使用这个轻量级的lib:JNRestClient

它将在后台进行加载