2013-03-11 4 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 반환 것이 분명합니다. 내 질문은 을 반환하기 전에이 블록이 완료 될 때까지이 메서드가 대기하도록하려면 어떻게해야합니까? (구성이 제대로로드되지 않으면 아니오)?

답변

4

YES을 반환하기 전에 데이터가 다운로드 될 때까지 기다리지 마십시오. iOS는 30 초 안에 시작하지 않으면 응용 프로그램을 죽이는 워치 독 데몬을 가지고 있습니다. 따라서 사용자가 인터넷 연결 상태가 좋지 않아 다운로드가 30 초를 초과하면 응용 프로그램이 시작되기 전에 응용 프로그램이 종료됩니다.

내 제안은 필요한 당사자에게 구성 다운로드를 알리는 알림을 사용하는 것입니다. 설치, 예를 들어 MYApplicationDidDownloadConfigurationNotification에 나열된 루트보기 컨트롤러가 필요하고 알림을 받으면 UI를 다시로드하거나 문제의 구성에 의존하는 다른보기 컨트롤러를 푸시합니다.

다운로드가 실패한 경우 - 대리자 메서드에서 NO을 반환하는 대신 UI를 업데이트하십시오. 모든 응용 프로그램이 시작된 후에 구성을 다운로드 할 운이 없었습니다.

1

메인 스레드에서 네트워크 액세스를 기다리지 않습니다. 반환 된 데이터에 대한 응용 프로그램의 나머지 부분을 초기화하는 코드를 추가하여 콜백 블록 downloadConfiguration:

1

내 제안은 진행 막대가있는 것으로 표시된 곳에서 시작 화면을 추가하는 것입니다. 진행률 표시 줄은 데이터가 다운로드 될 때까지 기다리는 중임을 나타내며 완료되면 다음 화면을 표시 할 수 있습니다.

[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를에서 다운로드 : 당신의 splashview 컨트롤러에서

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

당신의 appdelegate.h에 그래서, 당신의 코드를 포함?

예,이 경량 LIB 사용하는 경우 : JNRestClient

을 그리고 백그라운드에서 로딩을 할 것입니다

관련 문제