如何在网络中加载TabelView的数据(手动实现)?

本文介绍了一种手动实现的方式,用于在网络环境下加载多个图片到TableView中。详细步骤包括使用内存和缓存来存储图片数据,利用子线程进行图片加载以避免阻塞主线程,并通过特定方法解决cell复用带来的问题。
摘要由CSDN通过智能技术生成
从网络中加载到tabelView中多个图片需要注意(手动实现)
/**
 0.设置存放数据的可变字典(等于内存),设置存放是否执行子线程的可变字典,key值为图片的唯一标识 (链接)。
 1.存放位置包括:内存(自定义字典),缓存(cache中)
 2.判断内存中是否有数据,没有的话执行下一步
 3.拼接沙盒路径,判断数据data是否存在,存在的话设置图片,同时放到内存字典中;数据不存在的话,下一步
 4.加载图片,首先设置站位图片;判断线程是否存在,(从可变字典中取出正在执行的线程);operations等于nil,执行下一步
 5.开启子线程,加载数据,如果数据不存在直接返回,存在的话 设置数据,存到内存,存到缓存;
 6.回到主线程;调用该[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];方法加载数据,解决cell的复用问题。
 7.把子线程加载到队列中去,并把线程存放到可变字典中去。
 8.示例代码如下
 */
    UIImage *image = [self.images objectForKey:topic.icon];

    if (image)
    {
        cell.imageView.image = image;
    }else
    {
        //去沙盒中找
        NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
        //文件名
        NSString *fileName = [topic.icon lastPathComponent];

        //拼接文件全路径
        NSString *fullFile = [caches stringByAppendingPathComponent:fileName];

        NSData *data = [NSData dataWithContentsOfFile:fullFile];

        if(data)
        {
            UIImage *image = [UIImage imageWithData:data];

            cell.imageView.image = image;
            //往内存中存一份
            [self.images setObject:image forKey:topic.icon];

        }else
        {
            cell.imageView.image = [UIImage imageNamed:@"timo"];

            NSBlockOperation *opo = self.operations[topic.icon];

            if (opo == nil)
            {
                NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

                [NSThread sleepForTimeInterval:2.0];

                NSURL *url = [NSURL URLWithString:topic.icon];

                NSData *data = [NSData dataWithContentsOfURL:url];

                if (data == nil)
                {
                    return ;
                }

                UIImage *image = [UIImage imageWithData:data];

                //写到内存里去
                [self.images setObject:image forKey:topic.icon];

                //写到沙盒中去
                    [data writeToFile:fullFile atomically:YES];

                NSLog(@"%zd",indexPath.row);

                [[NSOperationQueue mainQueue] addOperationWithBlock:^{

                    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];

                }];
            }];

                [self.queue addOperation:op];

                self.operations[topic.icon] = op;
            }

        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值