NSURLConnectionに基づいて、iOSアプリでサーバー側のデータをフェッチするためのクラスを作成し、フェッチしたデータをデリゲートに転送して処理します。
text / jsonをダウンロードする場合、これは完全に機能します。
現在、いくつかのpng画像をフェッチするように拡張していますが、データを取得できません。
[receivedData appendData:data]が受信した画像データに対して何もしないdidReceiveData呼び出しで壊れていることがわかりました。
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// Append the new data to receivedData.
[receivedData appendData:data];
}
このメソッドにデータを取得しますが(NSData> 0バイト)、[receivedData appendData:data]を呼び出してもreceivedDataのサイズは変更されません(まだ0バイト)。
これは画像データではなくテキストで完全に機能するため、文字セットやエンコーディングと関係があると思いますが、これについては何も見つかりません。
どんな助けでも大歓迎です。
要求されたコードサンプルで更新します。
呼び出しを行うメソッドでは:
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if (theConnection) {
// Create the NSMutableData to hold the received data.
receivedData = [NSMutableData data];
// Also tried with no change in behaviour
// receivedData = [[NSMutableData alloc] initWithLength:0];
} else {
// Inform the user that the connection failed.
}
私のdidReceiveResponse
:
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
[receivedData setLength:0];
}
別の更新
クラスの3つのインスタンスを同時に起動して、3つのファイルを非同期にフェッチすると、問題は並行性に帰着します。receivedData
問題は、他の2つのインスタンスからの応答を台無しにしたときに最初のリリースが発生することです。
クラスの各インスタンスに独自のインスタンスがあることを確認するにはどうすればよいreceivedData
ですか?
最後の注意事項 取得したデータにMutableArraysのディクショナリを使用すると、同時実行の問題が解決されます。
また、MutableArrayをクラスのプライベートプロパティとして定義すると、インスタンスごとに1つの配列が作成されるようです。
@interface MyClass(){
@private NSMutableData * receivedData;
}