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's 便利方法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

您的代码中至少有两个错误。

第一个错误是你不应该调用[self.image initWithData],因为所有的 init 方法都应该被调用一次,并且在对象的构造过程中,就在 alloc 之后

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

第二个错误是上面的方法是增量的,可以在接收到完整图像之前多次调用。相反,您要做的是将数据存储在 NSMutableData 对象(或类似对象)中,直到收到所有数据,并在收到消息后创建图像:

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

您可能需要使用类别以外的其他内容才能正确执行此操作,因为您可能需要新属性。

于 2012-05-27T22:26:43.303 回答
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 回答
0

我认为您的问题是每次收到部分图像时都会创建图像。您应该将所有数据收集在一起,然后创建图像;

于 2012-05-27T21:55:19.487 回答