2013-03-11 76 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

,它會做的裝載在後臺

相關問題