8

インターネットに接続したときにローカルデータベースに保存されているオフラインデータをWebサーバーに送信するアプリを実装しようとしています。以下に示すコードを使用します。私がテストした限り、それは正常に動作しますが、膨大な数のレコードに対して正常に動作するかどうかはわかりません。このコードを微調整するとパフォーマンスが向上するかどうか知りたいのですが?

ノート

  • これはオフライン同期の目的では最悪のコードになることを私は知っているので、それをより良く調整しようとしています。
  • アプリからサーバーへの一方向の同期。

    -(void)FormatAnswersInJSON {
    
      DMInternetReachability *checkInternet = [[DMInternetReachability alloc] init];
      if ([checkInternet isInternetReachable]) {
         if ([checkInternet isHostReachable:@"www.apple.com"]) {//Change to domain
            responseArray = [[NSMutableArray alloc] init];
    
            dispatch_async(backgroundQueue, ^(void) {
    
                NSArray *auditIDArray = [[NSArray alloc] initWithArray: [self getUnuploadedIDs]];
                for (int temp = 0; temp < [auditIDArray count]; temp ++) {
    
                    // Code to post JSON to server
    
                    NSURLResponse *response;
                    NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
                    if (!error) {
                        NSString *responseID = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
                        if ([responseID isEqualToString:@"ERROR"]) {
                            //Error uploading records
                        } else {
                           [responseArray addObject:responseID];
                        }
                    } else {
                       //Error
                       return;
                    }
                }
                dispatch_async( backgroundQueue, ^{
    
                    /* Based on return code update local DB */
                    for (int temp = 0; temp < [responseArray count]; temp ++) {
                       [self updateRecordsForID:[auditIDArray objectAtIndex:temp] withID:[responseArray objectAtIndex:temp]];
                    }
                });
            });
         }
      }
    }
    
    - (void)upload { //Called when internet connection available
    
        if(backgroundQueue){
            dispatch_suspend(backgroundQueue);
            dispatch_release(backgroundQueue);
            backgroundQueue = nil;
        }
        backgroundQueue = dispatch_queue_create("com.XXXX.TestApp.bgqueue", NULL);
        dispatch_async(backgroundQueue, ^(void) {
            [self FormatAnswersInJSON];
        });    
    }
    
4

2 に答える 2

1

このコードが目の前にある場合、私のアプローチは次のようになります。

  • ユース ケースを見て、「膨大な数のレコード」を定義します。一度に 50 レコードの更新が定期的に発生しますか? それとも1秒と2秒でしょうか?ユーザーは Wi-Fi 接続を使用していますか、それとも有料ネットワークを使用していますか?など。
  • 可能であれば、野生でテストしてください。私のユーザーベースが十分に小さかった場合は、実際のデータを収集し、それが私の決定の指針となるようにするか、機能を一部のユーザー/ベータテストにのみリリースして測定します.
  • データが指示する場合は、このコードを最適化してより効率的にします。

私の最適化の手段は、グループ処理を行うことです。大まかなアルゴリズムは次のようになります。

for records in groups of X
  collect
  post to server {
    on return:
      gather records that updated successfully
      update locally
  }

これは、サーバー コードを変更できることを前提としています。10、20、50 などのグループを作成できます。これらはすべて、送信されるデータの種類とサイズによって異なります。

グループ アルゴリズムは、クライアント側の前処理が少し増えることを意味しますが、HTTP 要求を減らすという利点があります。少数の更新しか取得しない場合、これはYAGNIであり、時期尚早の最適化です。

この決定により、出荷が妨げられないようにしてください。

于 2013-03-14T22:55:42.460 に答える