2

私は AFNetworking を使用していますが、とても気に入っています。サーバーから JSON データを取得する必要がありますが、問題ありません。完全に機能します。

setDownloadProgressBlock を追加しましたが、JSON ダウンロードでは機能しないと思います。ダウンロードする推定バイト数を取得できない可能性があります。

私のコード:

  NSMutableURLRequest *request = [[VinocelaHTTPClient sharedClient] requestWithMethod:@"GET" path:@"ws/webapp/services/pull" parameters:nil];
  
  AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
                                                                                      success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 
  {
  }  
     
  } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
  {
  }];
                                       
  [operation setDownloadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) {
    NSLog(@"Get %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite);

  }];
  
  [operation start];

そして私の結果:

-1 バイトのうち 27129 を取得

-1 バイトのうち 127481 を取得

-1 バイトのうち 176699 を取得

では、AFNetworking は、zip ファイルや画像とは異なり、JSON データをダウンロードする場合、ダウンロードする実際のサイズを見積もることができないと思いますか?

4

1 に答える 1

2

ソースを熟読すると、進行状況のコールバックがキャッシュされた内部オブジェクトのexpectedContentLengthプロパティに渡されたようです。NSHTTPURLResponseそのため、何らかの理由でサーバーがContent-Lengthヘッダーを正しく送信していない場合、および/またはチャンク転送エンコーディングを行っている場合、その値は不明であり、値NSURLResponseUnknownLengthが返されます (たまたま -1 として定義されています)。

アプリのコンテキスト外で、HTTP 要求によって返されたヘッダーを調べてみてください。正常な値のヘッダーを取得した場合Content-Length、問題は AFNetworking 自体にある可能性があります。存在しない場合、問題はサーバーにあります。HTTP サーバーがチャンク転送エンコーディングを使用して JSON 応答を送信するのを見たことがありません (ほとんどの場合、コンテンツのサイズは比較的小さく、ヘッダーが送信される時点で既知である必要があります)。しかし、そうするのは仕様の範囲内です。

于 2012-02-08T21:17:09.073 に答える