7

次のように、NSURLConnectionを使用してHTTP経由で画像を取得しています-

NSMutableData *receivedData;

- (void)getImage {
    self.receivedData = [[NSMutableData alloc] init];
    NSURLConnection *theConnection = // create connection
}

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

-(void)connectionDidFinishLoading:(NSURLConnection *)connection {
   [connection release];

   UIImage *theImage = [UIImage imageWithData:receivedData];
}

通常は問題なく動作しますが、ログに記録されることがあります-:破損したJPEGデータ:データセグメントの途中で終了します

この時点では、画像は完全にはレンダリングされません。おそらく75%が表示され、右下隅が灰色のボックスになります。

これを修正する方法について何かアイデアはありますか?画像を正しく作成していませんか?

4

5 に答える 5

9

HTTPコードは正しいようです。ロードが完了したら、receivedDataのサイズをログに記録し、サーバー上のイメージの予想サイズと比較することをお勧めします。予想されるサイズの場合は、サーバー上で画像自体が破損している可能性があります。

于 2009-06-30T18:18:33.800 に答える
3

ASI-HTTPはこの問題を修正できます。

NSURL *coverRequestUrl = [NSURL URLWithString:imageStringURL];
ASIHTTPRequest *coverRequest = [[ASIHTTPRequest alloc] initWithURL:coverRequestUrl];
[coverRequest setDelegate:self];
[coverRequest setDidFinishSelector:@selector(imageRecieved:)];

[appDelegate.queue addOperation:coverRequest];
[appDelegate.queue go];

appDelegateのキュー変数はASINetworkキューオブジェクトです。非同期リクエストを送信するので、それを使用します。

- (void)imageRecieved:(ASIHTTPRequest *)response
{
    UIImage *myImage = [UIImage imageWithData:[response responseData]];
}
于 2009-11-17T05:08:32.547 に答える
2

NSMutableDictionaryを使用してこの問題を修正しました。

NSMutableDictionary *dataDictionary;

loadData関数で、データを定義します。

NSMutableData *receivedData = receivedData = [[NSMutableData alloc] init];

次に、キーが[theConnection description]で、オブジェクトが私のデータである辞書にデータをロードします。

[dataDictionary setObject:receivedData forKey:[theConnection description]];

そうすれば、デリゲートで、デリゲートに渡される接続の正しいデータオブジェクトを検索し、適切なデータインスタンスに保存できます。そうしないと、JPEGの改ざん/破損の問題が発生します。

didReceiveDataに、次のように記述します。

//get the object for the connection that has been passed to connectionDidRecieveData and that object will be the data variable for that instance of the connection.
NSMutableData *theReceivedData = [dataDictionary objectForKey:[connection description]];

//then act on that data
[theReceivedData appendData:data];

同様に、didReceiveResponseには、次のように記述します。

NSMutableData *theReceivedData = [dataDictionary objectForKey:[connection description]];
[theReceivedData setLength:0];

そして、connectionDidFinishLoading:NSMutableData * theReceivedData = [dataDictionary objectForKey:[connection description]]; img = [[UIImage alloc] initWithData:theReceivedData];

そして、これは非常にうまく機能しているようです。ちなみに、私のコードはNSUrlConnectionに関するAppleのチュートリアルに基づいており、個々の接続を追跡するためにNSMutableDictionaryが追加されています。これがお役に立てば幸いです。完全な画像処理コードを投稿してほしい場合はお知らせください。

于 2010-12-05T18:06:54.873 に答える
1

私もこれを見ました。データをファイルに保存してから、データを画像に読み戻すと、完全に機能します。jpeg画像データにhttpヘッダー情報があるのではないかと思います。

ファイルへの保存の回避策はうまくいかないので、誰かがこれに対する解決策を見つけてくれることを願っています。

// problem

UIImage *newImage = [UIImage imageWithData:receivedData];

// crappy workaround

[receivedData writeToFile:[NSString stringWithFormat:@"a.jpg"] atomically:NO];
UIImage *newImage = [UIImage imageWithContentsOfFile:@"a.jpg"];
于 2009-09-04T22:21:18.633 に答える
0

を使用してNSDataコンテンツをコピーするreceivedData = [NSData dataWithBytes:receivedData.bytes length:receivedData.length]ことも役立つ場合があります(ディスクに保存してディスクから読み取るよりも効率的です)。

これの考えられる理由は、元のreceivedDataオブジェクトがそのコンテンツを保持しておらず(たとえば、を使用して作成された場合[NSData dataWithBytesNoCopy:length:])、解放された後にそれらを読み取ろうとしたことです。

これは、オブジェクトを作成したスレッドの別のスレッドでこの問題が発生した場合に発生する可能性がありNSDataます。

于 2014-05-06T19:37:30.067 に答える