iOS异步下载图片问题

最近在异步请求图片加载到列表时,遇到了不理解的困难。将请求服务器的代码(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 时,都进行一步图片下载。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值