1

UIImageView画像の非同期読み込みを可能にするためのカテゴリを作成しました。

@implementation UIImageView (ImageLoader)

- (void) asyncLoadImageIntoView:(NSURL *)imageURL withLoadingIndicator:(BOOL)isLoadingIndicator {

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:imageURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];

    (void)[[NSURLConnection alloc] initWithRequest:request delegate:self];
}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response 
{
   // responseData = [[NSMutableData alloc] init];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{
    NSLog(@"didReceiveData %@", data);
    (void)[self.image initWithData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
{

//[textView setString:@"Unable to fetch data"];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{
    NSLog(@"Succeeded! Received image data");
}



@end

私の問題は、connection:didReceiveData:メソッドが呼び出されてデータがコンソールに出力[self.image initWithData:data]されても、ビューに画像が読み込まれていないように見えることです。ここでの問題は何ですか?

4

4 に答える 4

5

まず、mehdzorの権利; connection:didRecieveData:すべてのデータがあるという意味ではありません。確信が持てるまで待つ必要がありますconnectionDidFinishLoading:。たとえば、画像が非常に大きい場合、すべてが一度に表示されるとは限りません。

NSMutableData接続を開くときにインスタンスを作成し、それに追加する必要がありますconnection:didRecieveData:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{
    NSLog(@"didReceiveData %@", data);
    [[self mutableData] appendData:data]
}

これはカテゴリであるため、その可変データインスタンスを格納してアクセスするには、関連するオブジェクト関数を使用する必要があります。

第二に、[self.image initWithData:data]意味がありません。オブジェクトを割り当てるまではオブジェクトを初期化できません。またinit...、すでに初期化されているオブジェクトに送信することもできません。

ただし、この画像をプロパティに割り当てるため、UIImageの便利なメソッドを使用するのがより良い方法imageWithData:です。繰り返しにconnectionDidFinishLoading:なりますが、でこれを行う必要があります。これにより、接続がプルダウンしたすべてのデータが含まれる可変データインスタンスが渡されます。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection 
{
    NSLog(@"Succeeded! Received image data");
    [self setImage:[UIImage imageWithData:[self mutableData]]];
}

mutableDataこの後、インスタンスをクリーンアップ(リリース)することを忘れないでください。

于 2012-05-27T22:26:39.220 に答える
4

コードには少なくとも2つの間違いがあります。

[self.image initWithData]最初の間違いは、すべてのinitメソッドが一度だけ呼び出されることを意図しているため、呼び出すべきではないということです。オブジェクトの構築中は、allocの直後です。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{
    NSLog(@"didReceiveData %@", data);
    (void)[self.image initWithData:data]; // Wrong...
}

2番目の間違いは、上記の方法がインクリメンタルであり、完全な画像が受信される前に複数回呼び出される可能性があることです。代わりに、すべてのデータが受信されるまでデータをNSMutableDataオブジェクト(または同様のもの)に保存し、メッセージが表示されたらイメージを作成します。

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
   // Create an image with your NSMutableData object here
}

これを適切に行うには、おそらく新しいプロパティが必要になるため、カテゴリ以外のものを使用する必要があります。

于 2012-05-27T22:26:43.303 に答える
0

あなたの問題は、その一部を受け取るたびにイメージを作成することだと思います。すべてのデータを1つにまとめて、画像を作成する必要があります。

于 2012-05-27T21:55:19.487 に答える
0

問題を修正しました。理由はよくわかりませんが、最初にデータからUIImageを作成してから、UIImageViewの画像をUIImageに割り当てることができました。

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data 
{
    UIImage *img = [[UIImage alloc] initWithData:data];
    self.image = img;
}
于 2012-05-27T22:18:44.997 に答える