博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 多线程技术2
阅读量:6238 次
发布时间:2019-06-22

本文共 2787 字,大约阅读时间需要 9 分钟。

iOS 多线程技术2

NSOperation


  • NSInvocationOperation
//创建一个队列        NSOperationQueue *queue = [[NSOperationQueue alloc] init];        //创建子任务,定义子任务必须是 NSOperation 的子类        NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(dosomething:) object:@"NSInvocationOperation"];        //当把任务加入到队列后,自己主动开启线程        [queue addOperation:op];
  • NSBlockOperation
//创建一个队列        NSOperationQueue *queue = [[NSOperationQueue alloc] init];        //创建 NSBlockOperation 对象        NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{        [self doSomething];        }];        //加入队列        [queue addOperat:operation];

Demo:

以下我用NSOperation 的两种方法来创建一个样例,实现与上篇一样的功能,

#import "ViewController.h"---@interface ViewController ()@property (weak, nonatomic) IBOutlet UIImageView *iamgeView;@property (weak, nonatomic) IBOutlet UILabel *lable;@property (nonatomic, strong) NSOperationQueue *queue;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    // 1.NSInvocationOperation    NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(dosomething:) object:@"NSInvocationOperation"];    op.name = @"xiaoming";    NSOperationQueue *queue = [[NSOperationQueue alloc] init];    [queue addOperation:op];    NSLog(@"%@",queue.operations);    _queue = queue;}- (void)dosomething:(NSString*)str{  //耗时操作    [NSThread sleepForTimeInterval:3];    //须要在主线程中更新 UI    [self performSelectorOnMainThread:@selector(updateLable:) withObject:str waitUntilDone:YES];}- (void)updateLable:(NSString*)str{    if ([[NSThread currentThread] isMainThread]) {        NSLog(@"主线程>>>%s",__func__);    }    _lable.text = str;}- (IBAction)btnAction:(UIButton *)sender {    NSBlockOperation *blockOp = [NSBlockOperation blockOperationWithBlock:^{        //耗时操作        [NSThread sleepForTimeInterval:3];        //创建 url        NSString *urlStr = @"http://img.hb.aicdn.com/5a8f57157b47284724d09ffd2da28369731f8144ac9c-1XdZKJ_fw658";        NSURL *url = [NSURL URLWithString:urlStr];        NSData *data = [NSData dataWithContentsOfURL:url];        UIImage *image = [UIImage imageWithData:data];        //更新 UI        [self performSelectorOnMainThread:@selector(updateImageView:) withObject:image waitUntilDone:YES];    }];    [_queue addOperation:blockOp];}- (void)updateImageView:(UIImage*)img{    if ([[NSThread currentThread] isMainThread]) {        NSLog(@"主线程>>>>>>%s",__FUNCTION__);    }    _iamgeView.image = img;}@end

执行结果:

2015-08-02 15:03:33.909 05-NSOperationDemo[3284:874300] (
“{name = ‘xiaoming’}”
)
2015-08-02 15:03:36.911 05-NSOperationDemo[3284:874300] 主线程>>>-[ViewController updateLable:]
2015-08-02 15:03:47.730 05-NSOperationDemo[3284:874300] 主线程>>>>>>-[ViewController updateImageView:]

这里写图片描写叙述


你可能感兴趣的文章
JS实现的购物车
查看>>
bzoj 3998 [TJOI2015]弦论——后缀自动机
查看>>
STL 的 vector 根据元素的值来删除元素的方法
查看>>
NOI2002银河英雄传说——带权并查集
查看>>
复合数据类型,英文词频统计
查看>>
“main cannot be resolved or is not a field”解决方案
查看>>
oc中使用switch实现图片浏览功能,补充其它的实现方式
查看>>
6、DRN-----深度强化学习在新闻推荐上的应用
查看>>
用父类指针指向子类对象
查看>>
Flexigrid默认是可以选择多行
查看>>
PHP导入导出Excel方法小结
查看>>
ZOJ 3870 Team Formation 位运算 位异或用与运算做的
查看>>
清除浮动float的方法
查看>>
java学习第十二天
查看>>
1 Kubernetes管理之master和Node
查看>>
M端计算rem方法
查看>>
as3 用StyleSheet css 设置文本样式
查看>>
hdu4612(双连通缩点+树的直径)
查看>>
【转】深入理解 C# 协变和逆变
查看>>
第六次作业
查看>>