2011-12-14 11 views
2

サーバー(画像と文字列データ)にデータをPOSTしています。私はアップロードしたいオブジェクトごとに "ステータス"というコアデータの属性を持っています。私はこの属性に3つのステータスを入力して、アップロードの状態を示しています:未処理のアップロード(以前の試みは失敗しました)、アップロード処理(現在アップロード中)、アップロード完了(アップロード完了、成功)。私はすべての保留中のデータをアップロードするためにDBをチェックするタイマーを持っています。アップロードに失敗したオフラインデータとデータのアップロード

これは、失敗したデータとオフラインデータのアップロードを処理する適切な方法ですか?

これは正しい方法ですが、アップロードの試行中にユーザーがアプリを終了すると、アップロードのステータスを「アップロード処理中」から「アップロード待ち」または「アップロード完了」に変更する際に問題が発生しています。リクエストがタイムアウトしたとき。誰もがこれらの状況を処理する方法を知っていますか?

ところで、私はASIHTTPRequestをフレームワークとして使用してサーバーにリクエストしています。

恵み:)

感謝を集めるだろう。この最善の方法を行う方法の詳細な説明!

答えて

1

タイマーのアイデアは機能します。あなたのアプリケーションに適したある間隔でタイマーを介してデータマネージャークラスのuploadOutstandingObjectsを呼び出してください。

アップロードする必要のある「Foo」エンティティがあるとします。データマネージャークラスで次の操作を実行できます。

- (void)uploadOutstandingObjects { 
    // I use the great MagicalRecord class for Core Data fetching 
    // https://github.com/magicalpanda/MagicalRecord 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"status == pending"] 
    NSArray *outstandingObjects = [Foo MR_findAllWithPredicate:predicate]; 
    for (Foo *foo in outstandingObjects) { 
      [foo uploadToServer]; 
    } 

これを行う方法の1つは、通知を使用することです。アップロードを開始するたびに、そのオブジェクトは「uploadsStopped」通知を聞きます。アップロードが完了すると、アップロードされているオブジェクトはリスニングを停止します。

のFooクラス:

- (void)uploadFailed { 
    // change status to upload pending in the database for this 'foo' object 
} 
- (void)uploadComplete { 
    // change status to upload complete in the database for this 'foo' object 
} 
-(void)uploadToServer { 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(uploadFailed:) 
               name:@"uploadsStoppedNotification" 
               object:nil ]; 

    // perform upload. If you are doing this synchronously... 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:<url here>]; 
    [request startSynchronously]; 
    if (![request error]) { 
     [self uploadSucceeded]; 
     // stop listening to global upload notifications as upload attempt is over 
     [NSNotificationCenter removeObserver:self]; 
    } 
    else { 
     [self uploadFailed]; 
     // stop listening to global upload notifications as upload attempt is over 
     [NSNotificationCenter removeObserver:self]; 
} 

あなたのアプリは、あなたがまだ来て人々のための代替手段として

- (void)applicationDidEnterBackground:(UIApplication *)application { 
    // this will fire to any objects which are listening to 
    // the "uploadsStoppedNotification" 
    [[NSNotificationCenter defaultCenter] 
      postNotificationName:@"uploadsStoppedNotification" 
         object:nil ]; 
関連する問題