0

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;
}
4

2 に答える 2

1

初期化したことはありますreceivedDataか?

このような何かがそれをするでしょう:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    if(!receivedData)
    {
        receivedData = [NSMutableData data];
    }
    [receivedData appendData:data];
}

さらに高速なアプローチは、実際のリクエストを開始する直前に初期化することです(データを受信するたびにチェックされないようにするため)。

receivedDataまた、リクエストが完了し、次のリクエストに進む準備ができるように抽出が完了したら、nilを忘れないでください。


同時リクエストの1つの解決策は次のとおりです。

単一のNSMutableDataプロパティの代わりに、NSMutableDictionaryを作成して、一度に複数のインスタンスを保持できるようにします。

NSMutableDictionary *receivedData

これで、NSURLConnection(これを呼びましょう)をまとめたらurlConnection、新しい一意のデータオブジェクトを作成して、辞書に入れることができます。接続の文字列の説明を一意のキーとして使用できるはずです。

if(!receivedData)
  receivedData = [NSMutableDictionary dictionary];

NSMutableData *dataObject = [NSMutableData data];
[receivedData setObject:dataObject forKey:[urlConnection description]];

今、あなたはこれを行うことができます:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
  NSMutableData *currentData = (NSMutableData*)[receivedData objectForKey:[connection description]];
  [currentData.appendData:data];
}

接続が完了したらremoveObjectForKey、データオブジェクトが不要になったら、呼び出すことを忘れないでください。

于 2012-06-29T14:51:15.503 に答える
0

回避策を見つけました。これは、JSON応答でエンコードされたデータベース64をデバイスに送信し、デバイスでローカルにファイルを使用する前にデコードすることです。

これは、1回のリクエストで必要な3つのファイルを転送できるという点でも非常に役立ちます。

于 2012-07-02T18:33:49.743 に答える