2013-03-11 62 views
2

我对iOS开发非常陌生,并且在一段时间内摔跤任务。决定最终寻求帮助。等待数据在应用程序启动时加载

我有一些数据要从互联网加载,然后才让应用程序启动。我决定在AppDelegate

在那里,它是使用didFinishLaunchingWithOptions

- (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

在返回YES之前不要等待数据下载。 iOS有看门狗守护进程,如果应用程序尚未在30秒内启动,该守护进程会终止该应用程序。所以如果你的用户有非常糟糕的互联网连接导致下载超过30秒 - 你的应用程序将在开始之前被杀死。

我的建议是使用通知来通知配置的下载需要的各方。安装程序需要列出的根视图控制器,例如MYApplicationDidDownloadConfigurationNotification,一旦收到通知,它将重新加载用户界面或推送一些其他视图控制器,这些视图控制器取决于相关配置。

如果下载失败 - 更新UI,而不是从委托方法返回NO。在所有应用程序确实启动后,只是没有运气来下载配置。

1

切勿等待主线程上的网络访问。只需添加代码,以初始化您的应用程序的其余部分返回的数据,回到012B

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   
     } 
    }]; 
-1

你从REST API下载?

如果是使用重量轻的lib:JNRestClient

,它会做的装载在后台

相关问题