2012-03-07 1 views
4

まず、AFHTTPClientを使用して単一のインデックスドキュメントをダウンロードし、CoreDataを使用して各レコードを記録します。その後、個々のレコードをダウンロードするために別のプロセスをスピンアップする必要があります。これを行う最善の方法は何ですか?iOSでAFNetworkingとCoreDataを使用してリソースをダウンロードするための構造を最適にする方法

各リソースをリクエストして完了させるのが妥当ですか? 100年ほどかかるかもしれません。

また、最初にロードしてリクエストを送信し、成功した後にロードして後続のリクエストを送信することもできます。

私はCoreDataを使用してデータベースを更新していますが、これはそれぞれの要求に対して別々のNSManagedObjectContentが必要なことを意味していますか?

私は興味がありますが、AFHTTPClientはメインスレッド、または要求を開始したスレッドでコールバックを実行しますか?私はむしろメインスレッドがCoreData I/Oの実行をブロックしないようにしたいと思います。

+0

あなたがバックグラウンドスレッド(と同様に、それぞれ他のスレッド)に別々の 'NSManagedObjectContext'を持っている必要があります。ネットワークからオブジェクトを受け取った後、それらをあなたのバックグラウンド管理されたオブジェクトコンテキストに入れて、そのコンテキストをあなたのアプリ内の他の管理オブジェクトコンテキストに同期させます。 – nielsbot

+0

セルネットワークのネットワークを理解することは、レイテンシが最大の問題であることです。接続ごとに時間コストを支払うことになります。要求を結合することができれば、より良いネットワークパフォーマンスを得ることができます。 – nielsbot

答えて

2

リソースのダウンロードに関して、AFNetworkingを使用してキューに入れることができます。

AFHTTPClientの - (void)enqueueHTTPRequestOperation:(AFHTTPRequestOperation *)操作を使用することができます。

まずそのようなあなた自身のAFHTTPClientを保持するシングルトンを作成します。

@interface CustomHTTPClient : NSObject 

+ (AFHTTPClient *)sharedHTTPClient; 

@end 


@implementation CustomHTTPClient 

+(AFHTTPClient *)sharedHTTPClient { 

    static AFHTTPClient *sharedHTTPClient = nil; 

    if(sharedHTTPClient == nil) { 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 

    // Create the http client 
    sharedHTTPClient = [AFHTTPClient clientWithBaseURL:[NSURL URLWithString:@"http://mybaseurl.com"]]; 

    }); 
    } 

    return sharedHTTPClient; 
} 

@end 

は、そのようにのようなあなたの要求をキュー:

// Store the operations in case the failure block needs to cancel them 
__block NSMutableArray *operations = [NSMutableArray array]; 

// Add operations for url 
for (NSURL *url in urls) { 

    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

    __block AFHTTPRequestOperation *operation = [[CustomHTTPClient sharedHTTPClient] 
              HTTPRequestOperationWithRequest:request 
              success:^(AFHTTPRequestOperation *operation , id responseObject){ 

              // Do something 

              } 
              failure:^(AFHTTPRequestOperation *operation , NSError *error){ 

              // Cancel all operations if you need to 
              for (AFHTTPRequestOperation* operation in operations) { 
               [operation cancel]; 
              } 

              }]; 

    [operations addObject:operation];  
} 

for (AFHTTPRequestOperation* operation in operations) { 
    [[CustomHTTPClient sharedHTTPClient] enqueueHTTPRequestOperation:operation]; 
} 

enqueueBatchOfHTTPRequestOperationsもあります:あなたがする必要がある場合:progressBlock:completionBlockは進行状況を監視する。

AFNetworkingプロジェクト: https://github.com/AFNetworking/AFNetworking/

AFNetworkingドキュメント: http://afnetworking.org/Documentation/index.html

関連する問題