IT虾米网

NSThread中cancle与exit的使用详解

leader 2018年06月24日 手机开发 446 0
 
 
@interface ViewController () 
 
 
/** 图片视图*/ 
 
@property(nonatomic,weak) UIImageView * imageView; 
 
 
/** 图片数组*/ 
 
@property(nonatomic,strong) NSMutableArray * imageArray; 
 
 
/** 存储线程*/ 
 
@property(nonatomic,strong) NSMutableArray * threadArray; 
 
 
@end 
 
 
//对象方法cancle,可以在外部使用。 
 
//类方法exit,写在线程内部,结束当前现线程。 
 
//两者结合使用,使用cancle进行标记,使用exit退出 
 
 
@implementation ViewController 
 
- (NSMutableArray *)imageArray 
 
{ 
 
    if (_imageArray==nil) { 
 
        _imageArray =[NSMutableArray array]; 
 
    } 
 
    return _imageArray; 
 
} 
 
 
- (NSMutableArray *)threadArray 
 
{ 
 
    if (_threadArray==nil) { 
 
        _threadArray =[NSMutableArray array]; 
 
    } 
 
    return _threadArray; 
 
} 
 
 
- (void)viewDidLoad 
 
{ 
 
    [super viewDidLoad]; 
 
     
 
    //加载视图 
 
    [self _loadViews]; 
 
     
 
    //开启多线程加载图片 
 
    [self _openMultiThread];     
 
} 
 
 
//======加载这个,可以在主线程中加载 
 
- (void) _loadViews 
 
{ 
 
    for (int i=0;i<15; i++) 
 
    { 
 
        int col=i%3; 
 
        int row=i/3; 
 
         
 
        UIImageView *imageView=[[UIImageView alloc] initWithFrame:CGRectMake(22+col*(80+45), 40+row*(100+20), 90, 90)]; 
 
        imageView.backgroundColor=[UIColor redColor]; 
 
        [self.imageArray addObject:imageView]; 
 
         
 
        [self.view addSubview:imageView]; 
 
    } 
 
//    添加按钮 
 
     UIButton * button=[UIButton buttonWithType:UIButtonTypeContactAdd]; 
 
     button.frame=CGRectMake(0, 20, 20, 20); 
 
     [button addTarget:self action:@selector(btClick) forControlEvents:UIControlEventTouchUpInside]; 
 
     [self.view addSubview:button];     
 
} 
 
 
//开启多线程加载图片 
 
- (void) _openMultiThread 
 
{ 
 
    for (int i=0; i<self.imageArray.count; i++) 
 
    { 
 
//        [NSThread detachNewThreadSelector:@selector(loadImage:) toTarget:self withObject:@(i)]; 
 
         
 
//        要存数组就不能使用类方法创建线程 
 
        NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(loadImage:) object:@(i)]; 
 
        [thread start]; 
 
        [self.threadArray addObject:thread]; 
 
    } 
 
} 
 
 
 
 
- (void)loadImage:(NSNumber *) number 
 
{ 
 
    //取到索引 
 
    NSInteger index=[number integerValue]; 
 
    
 
    NSString * imageSrc=@"http://images.cnblogs.com/cnblogs_com/kenshincui/613474/o_%d.jpg"; 
 
     
 
    imageSrc=[NSString stringWithFormat:imageSrc,index]; 
 
     
 
     
 
    NSURL * URL=[NSURL URLWithString:imageSrc]; 
 
    NSData * data=[NSData dataWithContentsOfURL:URL]; 
 
    UIImage *image=[UIImage imageWithData:data]; 
 
     
 
    //封装model 
 
    ImageModel * model=[[ImageModel alloc] init]; 
 
    model.image=image; 
 
    model.index=index; 
 
     
 
   //如果状态为删除,则退出线程 
 
    NSThread * thread = [NSThread currentThread]; 
 
    if ([thread isCancelled]) 
 
    { 
 
        [NSThread exit];//执行exit,后边的语句不再执行。所以不用写return 
 
    //return也可以退出进程,一旦退出就不能再使用start开启 
 
    } 
 
    NSLog(@"%@", thread); 
 
    [self performSelectorOnMainThread:@selector(showImage:) withObject:model waitUntilDone:NO]; 
 
} 
 
 
//回到主线程更新图片 
 
- (void) showImage:(ImageModel *) model 
 
{ 
 
    UIImageView * imageView=self.imageArray[model.index]; 
 
    imageView.image=model.image; 
 
} 
 
 
 
#pragma mark - 点击事件 
 
- (void)btClick 
 
{ 
 
//    当点击按钮时,对所有线程进行标记 
 
    for (NSThread * t in self.threadArray) 
 
    { 
 
        [t cancel]; 
 
    } 
 
} 

发布评论

分享到:

IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

iOS监听系统键盘的出现和消失详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。