2

私は 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

4 に答える 4

5

を返す前に、データがダウンロードされるのを待たないでくださいYES。iOS には、30 秒以内にアプリケーションが起動しない場合にアプリケーションを強制終了するウォッチドッグ デーモンがあります。したがって、ユーザーのインターネット接続が非常に悪く、ダウンロードが 30 秒を超える場合、アプリケーションは開始前に強制終了されます。

私の提案は、通知を使用して、必要な関係者に構成のダウンロードを通知することです。リストに必要なルートView Controllerをセットアップし、MYApplicationDidDownloadConfigurationNotificationその通知を受信したら、UIをリロードするか、問題の構成に依存する他のView Controllerをプッシュします。

NOダウンロードに失敗した場合 -デリゲート メソッドから戻るのではなく、UI を更新します。すべてのアプリケーションが起動した後、構成をダウンロードする運がなかっただけです。

于 2013-03-11T14:07:01.757 に答える
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;
}

スプラッシュビュー コントローラーにコードを含めます。

[Configuration downloadConfiguration:^(NSMutableArray *currencies, double refreshIntervalInMilis, double timeDifferenceInMilis, NSError *error)  {
        if (error) {
            //displaying error dialog
        } else {
            //doing some stuff with data loaded          
        }
    }];  
于 2013-03-11T14:24:49.520 に答える
0

メインスレッドでネットワークアクセスを待たないでください。返されたデータの残りのアプリケーションを初期化するコードを、のコールバックブロックに追加するだけです。downloadConfiguration:

于 2013-03-11T14:11:22.287 に答える
-3

REST API からダウンロードしていますか?

はいの場合、この軽量ライブラリを使用します: JNRestClient

そして、バックグラウンドで読み込みを行います

于 2014-02-07T17:44:51.250 に答える