Was*_*sim 1 cocoa-touch objective-c nsurlconnection
我创建了一个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
Run Code Online (Sandbox Code Playgroud)
我的问题是,即使connection:didReceiveData:调用该方法并将数据打印到控制台,[self.image initWithData:data]似乎也没有将图像加载到视图中.这里有什么问题?
首先,mehdzor是对的 ; connection:didRecieveData:并不意味着你已经获得了所有数据; 你需要等到你connectionDidFinishLoading:确定.例如,如果图像非常大,则可能不会同时出现.
您应该NSMutableData在打开连接时创建一个实例,并在其中添加connection:didRecieveData::
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"didReceiveData %@", data);
[[self mutableData] appendData:data]
}
Run Code Online (Sandbox Code Playgroud)
由于这是一个类别,您可能必须使用关联的对象函数来存储和访问该可变数据实例.
第二,[self.image initWithData:data]没有任何意义.在分配对象之前无法初始化对象,并且无法发送init...到已初始化的对象.
但是,更好的方法是,因为你要将这个图像分配给一个属性,就是UIImage使用方便的方法imageWithData:.同样,您需要执行此操作connectionDidFinishLoading:,并且您将传递可变数据实例,该实例现在具有连接可以下拉的所有数据:
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"Succeeded! Received image data");
[self setImage:[UIImage imageWithData:[self mutableData]]];
}
Run Code Online (Sandbox Code Playgroud)
mutableData在此之后不要忘记清理(释放)实例.
| 归档时间: |
|
| 查看次数: |
1190 次 |
| 最近记录: |