10

これに関連する他の質問を確認しましたが、これはもう開発されていないため、唯一の答えは「使用するASIHTTPRequest」です。SDK で作業しているときに、人々が使用している代替手段を尋ねたかったのですが、多くの奇妙な動作に遭遇しましたNSURLConnectionサーバーからデータを受信するとき。

NSURLConnectionチャンク エンコーディングの応答をうまく処理できないという事実まで追跡しました。または、少なくともNSURLConnection と "chunked" transfer-coding のこの質問を読みました

私たちが話していた開発者の中には、iOS 5 で改善されたと言っている人もいますが、SDK が少なくとも iOS 4.3 と下位互換性があることを確認する必要があります。

NSURLConnectionこれが事実上の問題であり、人々がそれをどのように扱っているかを確認したい.

これまでに見つけたすべての代替案はに基づいNSURLConnectionており、同じ欠陥があると想定しています。ASIHTTPRequestよりも少し低いベースであるため、実際には機能しましたNSURLConnectionが、サポートされなくなったことを知って代替手段を探していました。

調べた他のライブラリの リストは次の Restkitとおり ShareKitです 。 LRRestyAFNetworkingTTURLRequest

ここに同様の質問があることは承知していますRESTKit は ASIHTTPRequest の適切な代替品ですか? ここではASIHTTPRequest の代替案ですが、どちらのソリューションも NSURLConnection に基づいています。

編集:投稿の冒頭で間違った質問を指摘したことに気付いたので、更新しました。それは 2008 年のスレッドを指しています。同様のスレッドを見たことがありますが、最近のものはありません。

4

3 に答える 3

19

チャンク転送は NSURLConnection でサポートされています。私はそれらを使用します。

  1. いくつかの小道具を定義します:

    NSMutableData * responseData;
    NSURLConnection * connection;
    
  2. 接続を確立する

    NSURL *url = [NSURL URLWithString:@"...."];
    self.responseData = [[NSMutableData alloc] initWithLength:0] ;
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
    self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:YES];
    
  3. 接続を確立するためのコールバック メソッドを登録する

    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
         // You may have received an HTTP 200 here, or not...
         [responseData setLength:0];
    }
    
  4. 「chunk received」のコールバック メソッドを登録します。

    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
        NSString* aStr = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
    
        NSLog(@"This is my first chunk %@", aStr);
    
    }
    
  5. 「接続完了」コールバックを登録します。

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
       [connection release];
    }
    
  6. 最後に、「接続に失敗しました」コールバックを登録します。

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
    NSLog(@"Something went wrong...");
}
于 2012-02-27T23:03:07.383 に答える
9

Just to chime in for the next person that gets here and still can't get NSURLConnection to work with chunk encoded data.

NSURLConnection will work with chunked encoding, but has non-disclosed internal behaviour such that it will buffer first 512 bytes before it opens the connection and let anything through IF Content-Type in the response header is "text/html", or "application/octet-stream". This pertains to iOS7 at least.

However it doesn't buffer the response if Content-Type is set to "text/json". So, whoever can't get chunked encoded NSURLConnection responses to work (i.e. callbacks aren't called) should check the response header and change it on the server to "text/json" if it doesn't break application behaviour in some other way.

于 2014-06-12T10:36:54.767 に答える
2

私が知っている代替手段はありません。

他のすべてのライブラリは、NSURLConnection の上に構築されています。ただし、iOS 以外のライブラリのいずれかを使用できます。libcurl。

ASIHTTPRequest は、私が認識している唯一のライブラリであり、代わりに CFNetworking レイヤーの上に構築されています。これが(おそらく間接的に)元の開発者が作業をやめた主な理由でした.NSURLConnectionを使用していないため、多くのコードがあります.

ASIHTTPRequest がサポートされなくなったと言うのは、おそらく厳密には正しくありません。元の開発者がもう取り組んでいないのは事実ですが、github のコミットを見ると、他の人がまだ取り組んでいることがわかります。私を含め、様々な理由で今でも多くの人がそれを使用しています。

そうは言っても、あなたが抱えている問題に戻ると、NSURLConnectionの1年前のリリース(つまりiOS 4.3)がチャンクをサポートしていないことを証明するために、3年前のスレッドが必ずしも決定的な参照になるかどうかはわかりません転送します。チャンク転送はウェブ上で非常に頻繁に使用されているため、これほど大規模で明白な問題が発生する可能性は非常に低いと思われます。使用しているサーバーに固有の何かが問題を引き起こしている可能性があります。

于 2012-02-15T19:42:29.370 に答える