您的位置:首页 > 移动开发 > IOS开发

iOS异步下载图片问题

2014-10-28 13:01 204 查看
最近在异步请求图片加载到列表时,遇到了不理解的困难。将请求服务器的代码(request和connection)放在了for循环中,每次循环都从数组相应元素中获取图片链接地址,创建相应的requ和connection。然后回调各自相应的

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
方法和
-(void)connectionDidFinishLoading:(NSURLConnection *)connection 方法及
- (void)connection:(NSURLConnection *)connection didFailWithError: 方法。
因为这是异步的网络请求(新开启一个线程进行相应的网络请求),故在执行回调方法之前for循环已经执行完了(与回调方法在不同线程运行)。for循环如下:

for(int i =0; i < [arraycount];
++i)
{
NSString *urlStr = [[arrayobjectAtIndex:i]
objectForKey:@"userImage"];
url = [NSURLURLWithString:urlStr];

NSMutableURLRequest *request = [[NSMutableURLRequestalloc]
initWithURL:url];
[requestsetHTTPMethod:@"GET"];

NSURLConnection *connection = [[NSURLConnectionalloc]
initWithRequest:requestdelegate:self];
if(connection)
{
NSLog(@"%@",url);
self.datas = [NSMutableDatanew];
NSLog(@"%@",self.datas);

}
}

但问题是在列表中显示的图片都一样,而数组中存储的图片链接是不同的。?????????可能也跟在创建request时设置缓存策略有关,但试了几种策略都是出现一样的图片。

后来觉得是不是因为回调网络请求方法之前for循环已经结束,故请求的网络地址都是数组的最后一个,但显示的图片不是最后一个,而且觉得这种原因不太符合逻辑,因为每个request都是根据其相应的url来创建的,而且在创建request时url都是不同的。

也想过通过判断使上一次请求的图片返回后,在进入创建request和connection的代码,这样每次回调网络请求方法时url都是相对应的url(这样想是不是就是错误的??因为每个request都是根据其相应的url来创建的,而且在创建request时url都是不同的。??????)。但是这样做就一直在for循环中来回循环,根本没回调网络请求方法。???????(这样想就是错误的,通过在connectionDidFinishLoading:方法中将data转换成NSString类型,进行内容比较,几次得到的data对应的NSString类型的内容相同)做法如下:

while(z < [array count])
{

self.datas = [NSMutableData new];
if(z == 0 || y == z+1)
{
NSString *urlStr = [[arrayobjectAtIndex:i]
objectForKey:@"userImage"];
url = [NSURLURLWithString:urlStr];

NSMutableURLRequest *request = [[NSMutableURLRequestalloc]
initWithURL:url];
[requestsetHTTPMethod:@"GET"];

NSURLConnection *connection = [[NSURLConnectionalloc]
initWithRequest:requestdelegate:self];
if(connection)
{
NSLog(@"%@",url);
self.datas = [NSMutableDatanew];
NSLog(@"%@",self.datas);

}
z++;
}

}

-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"%@",url);
[self.datasappendData:data];
NSLog(@"添加数据");
z =
y;
}

-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
y++;

UIImage *image = [UIImageimageWithData:self.datas];
[infoArrayaddObject:image];
NSLog(@"y是%d",y);

[self.tableViewreloadData];
}

这样写可能行不通,这样写的思路是先把图片全都下载下来,再依次放到每个cell中。常规思路应该是在cellForRowIndexPath方法中进行异步图片下载,每次生成cell 时,都进行一步图片下载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: