iOS中关于动态Tableview中的cell数据传输的多线程问题解决之拙见

iOS中关于动态Tableview中的cell数据传输的多线程问题解决之拙见

(2015-12-05 12:48:20)[编辑][删除]

转载

   

首先我们先明确一下问题:

1.因为UI是在主线程中更新的,不能在down数据的同时显示界面,这样会使得下载的时间占用主线程,导致的后果就是你的屏幕就那样的卡死在哪了

2.如果要解觉问题1,就势必要将其下载数据的环节放在其他分线程上来实现,但是这里还会遇见一个问题,分线程的执行是不会有序的,这样,在动态显示的过 程中,cell中的数据就会混乱的变化(这里解释的不够清晰,主要是因为,在传递数据时,本人用的是属性数组,应为多线程存入数组的次序是乱序的,这里我 已经用NSoperation队列实现了有序)

解决方案: 将数据的下载提前到ViewDidLoad中的多线程中进行,在tableview的问题3中实现方法是:判断数组中的数据是否完全下载结束,如果没有下载完,就用系统预设的方案来显示,判断下载完了再在动态滑动的时候去更新这些数据,

注意:这里有一个很大的问题,目前还为解决,因为数据是连续的,不可能都存放到数组中,这样会导致站的内存变大,所以还希望有大神解决一下

附上demo

//

//  PIcTableViewController.h

//  故事版自定义Cell 内加线程

//

//  Created by tareba on 15/12/2.

//  Copyright © 2015年 tanada. All rights reserved.

//

#import

@interface PIcTableViewController : UITableViewController

@end

//

//  PIcTableViewController.m

//  故事版自定义Cell 内加线程

//

//  Created by tareba on 15/12/2.

//  Copyright © 2015年 tanada. All rights reserved.

//

//#import "AppRecord.h"

#import "PIcTableViewController.h"

#import "NewCell.h"

@interface PIcTableViewController ()

@property (nonatomic,strong) NSMutableArray * arrIamge;

@property(nonatomic,strong) NSOperationQueue *operationQueue;

@property (nonatomic,strong)NSArray*imgURLs;

@property (nonatomic,strong)UIImage *image;

@end

@implementation PIcTableViewController

- (NSArray *)imgURLs {

if(_imgURLs == nil) {

NSString*[email protected]"http://down.tutu001.com/d/file/20101129/2f5ca0f1c9b6d02ea87df74fcc_560.jpg";

NSString *[email protected]"http://img.taopic.com/uploads/allimg/130501/240451-13050106450911.jpg";

NSString* [email protected]"http://pic.nipic.com/2007-11-09/2007119122519868_2.jpg";

NSString* [email protected]"http://pic.nipic.com/2007-11-09/200711912230489_2.jpg";

_imgURLs [email protected][[NSURL URLWithString:i1],[NSURL URLWithString:i2],[NSURL URLWithString:i3],[NSURL URLWithString:i4] ];

}

return _imgURLs;

}

-(void)downloadImage:(NSArray*)arrURLs{

for (int i=0; icount; i++) {

NSData *data=[NSData dataWithContentsOfURL:self.imgURLs[i]];

UIImage *image=[UIImage imageWithData:data];

[self.arrIamge addObject: image];

}

}

- (void)viewDidLoad {

[super viewDidLoad];

NSInvocationOperation*op=[[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downloadImage:) object:self.imgURLs];

NSOperationQueue *queue=[[NSOperationQueue alloc]init];

[queue addOperation:op];

self.tableView.backgroundColor=[UIColor whiteColor];

[self.tableView registerClass:[NewCell class] forCellReuseIdentifier:@"Cell"];

// Uncomment the following line to preserve selection between presentations.

// self.clearsSelectionOnViewWillAppear = NO;

// Uncomment the following line to display an Edit button in the navigation bar for this view controller.

// self.navigationItem.rightBarButtonItem = self.editButtonItem;

}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{

return 200;

}

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {

//#warning Incomplete implementation, return the number of sections

return 1;

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

//#warning Incomplete implementation, return the number of rows

return 12;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

NewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];

if (self.arrIamge.count!=self.imgURLs.count) {

cell.imageview.image=[UIImage imageNamed:@"Lion.jpg"];

NSLog(@"%@",cell.imageview.image);

return cell;

}else{

NSInteger index=indexPath.row%self.arrIamge.count;

cell.imageview.image=self.arrIamge[index];

return cell;

}

//    dispatch_async( dispatch_get_main_queue(), ^{

//        cell.imageview.image=self.image;

//         NSLog(@"2 %@",[NSThread currentThread]);

//     });

//

}

- (NSMutableArray *) arrIamge {

if(_arrIamge == nil) {

_arrIamge = [NSMutableArray array ];

}

return _arrIamge;

}

@end

自定义的cell

//

//  NewCell.h

//  故事版自定义Cell 内加线程

//

//  Created by tareba on 15/12/2.

//  Copyright © 2015年 tanada. All rights reserved.

//

#import

@interface NewCell : UITableViewCell

@property (strong, nonatomic) UIImageView *imageview;

@end

//

//  NewCell.m

//  故事版自定义Cell 内加线程

//

//  Created by tareba on 15/12/2.

//  Copyright © 2015年 tanada. All rights reserved.

//

#import "NewCell.h"

@implementation NewCell

- (UIImageView *)imageview {

if(_imageview == nil) {

_imageview = [[UIImageView alloc] init];

_imageview.backgroundColor=[UIColor redColor];

[self.contentView addSubview:_imageview];

[_imageview mas_makeConstraints:^(MASConstraintMaker *make) {

make.edges.mas_equalTo(UIEdgeInsetsMake(0, 0, 0, 0));

}];

self.contentView.contentMode=UIViewContentModeScaleAspectFit;

}

return _imageview;

}

- (void)awakeFromNib {

// Initialization code

}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

[super setSelected:selected animated:animated];

// Configure the view for the selected state

}

@end

时间: 2024-10-23 01:10:39

iOS中关于动态Tableview中的cell数据传输的多线程问题解决之拙见的相关文章

IOS 延时加载TableView中Cell中的图片

TableView中图片延时加载是本文要介绍的内容,经常我们会用tableView显示很多条目,有时候需要显示图片.但是一次性从服务器上取来所有图片对用户来浪费流量,对服务器也是负担,最好是按需加载,即当该用户要浏览该条目时再去加载经常我们会用tableView显示很多条目. 有时候需要显示图片, 但是一次从服务器上取来所有图片对用户来浪费流量,,对服务器也是负担.最好是按需加载,即当该用户要浏览该条目时再去加载它的图片. 重写如下方法 - (void)tableView:(UITableVie

IOS开发中如何解决TableView中图片延时加载

经常我们会用tableView显示很多条目, 有时候需要显示图片, 但是一次从服务器上取来所有图片对用户来浪费流量, 对服务器也是负担.最好是按需加载,即当该用户要浏览该条目时再去加载它的图片. - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { UIImage *image = [self g

蓝懿iOS培训日志15 tableView和自定义Cell(1)

今天学了很多新内容  需要时间消化,笔记如下: tableView的分组 通过判断section==?来实现不同section有不同行数 需要去掉行与行之间的线时 把separator改一下default(默认)改成None    default时有线 可以改变线的颜色 TableHeaderView  和 TableFooterView tableView上面需要显示内容时 用headerView (比如点开某条微博 上面显示微博内容 下面是评论列表) 需要显示在列表尾端的用FooterVie

iOS开发小技巧--TableView中headerView的循环利用,以及自定义的headerView

一.首先要搞清楚,tableView中有两种headerView,一个是tableHeaderView,另一个是headerView.前者就一个;后者根据session决定个数 headerView的循环利用跟cell的循环利用差不多,同样也可以注册,代码如下: 二.百思项目中,headerView只显示文字,但是只搞一个Label没法调整文字左边的间距.所以考虑包装一层view.进行了自定义headerView的封装,重写了headerView的 - (instancetype)initWit

mybatis中的动态语句中多条件or如何书写

1.说明 sql如下: SELECT COUNT(DISTINCT t.contract_id) FROM `plm`.`t_plm_contract_monitor` t WHERE 1=1 ANd (t.whole_id_one in ( 77 ) or t.whole_id_five in ( 77 ) or t.whole_id_six in ( 50563002294 )) AND t.is_deleted = 0 说明: t.whole_id_one 原文地址:https://www

动态切换tableView中的cell的种类

为什么要动态切换tableView中cell的种类呢?如果项目经理不出这种需求,你也就见不到这篇文章了:) 效果: 源码: 首先,你要准备3种cell,直接继承系统的就行了. // // RootViewController.m // ChangeCell // // Copyright (c) 2014年 Y.X. All rights reserved. // #import "RootViewController.h" #import "YellowCell.h&quo

解决tableView中cell动态加载控件的重用问题

tableView的cell,有时候需要在运行时取得对应的数据后才能够动态的创建该cell中的控件并加载到该cell中,此时,你一定会遇到重用问题,即使你能做到该cell只根据数值加载了一回控件,你也没法保证不出现重用问题:) 效果(请注意查看,移动下面的格子时,上面出现了重用的问题) 源码: YXCell.h // // YXCell.h // YXTableView // // Copyright (c) 2014年 Y.X. All rights reserved. // #import

iOS实现TableView中Cell出现时弹出动画

发现一个简单的方式可以让TableView变得非常的炫酷,语言描述太苍白,直接看图吧: 在任何有cell先出现在屏幕上的时候都会有这么一个效果,非常的流畅,也非常有意思(忍不住不停地把玩..).实现起来也非常简单,iOS原生支持,几行代码就可以搞定,在众多的tableview代理方法中,我们利用下面这个方法: -(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtInde

iOS中UITableView数据源刷新了,但tableview当中的cell没有刷新

你会不会遇到通过断点查看数据源模型的确刷新了,但是tableview没有刷新的情况,我遇到了,并通过下面的方法解决了,供大家参考! 在tableview中的数据源代理方法 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo } span.s1 { } span.s2 { font: 11.0px Menlo; color: #703daa } - (UITableViewCell *)tableView:(UITableView