关闭

iOS学习笔记--02 多线程

标签: 多线程gcd
259人阅读 评论(0) 收藏 举报
分类:

iOS的有三种多线程技术:

(一)NSThread
(二)Cocoa Operation
(三)GCD(全称:Grand Central Dispatch
以上三种技术,抽象程度从低到高。抽象程度越高,当然使用起来越简单好用。后者也是苹果较为推荐的方式。

(一)NSThread

两种实现方式:
1)实例方法

- (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullableid)argument;

2)类方法

+ (void)detachNewThreadSelector:(SEL)selector toTarget:(id)target withObject:(nullableid)argument;


ps:所谓的实例方法,就是需要实例化一个对象,使用该对象进行调用。而类方法则直接使用类名调用的方式。

参数的意义:
selector :线程执行的方法,这个selector只能有一个参数,而且不能有返回值。
target  :selector消息发送的对象
argument:传输给target的唯一参数,也可以是nil
 
第一种方式是先创建线程对象,然后再运行线程操作,在运行线程操作前可以设置线程的优先级等线程信息;
第二种方式会直接创建线程并且开始运行线程。

下面是两种方式的实现示例:
1)实例方法实现:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSThread *myThread = [[NSThread alloc]initWithTarget:self selector:@selector(doSomething) object:nil];
    [myThread start];
}
-(void)doSomething{
    NSLog(@"新线程:%@",[NSThread currentThread]);
}

2)类方法实现:

- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"主线程%@",[NSThread currentThread]);
    [NSThread detachNewThreadSelector:@selector(doSomething) toTarget:self withObject:nil];
}
-(void)doSomething{
    NSLog(@"新线程:%@",[NSThread currentThread]);
}

下面是下载图片的例子:
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet UIImageView *myImageView;

@end

#import "ViewController.h"
#define imgUrl @"http://c.hiphotos.baidu.com/image/w%3D310/sign=4b3d50d58813632715edc432a18ea056/d52a2834349b033b015730d317ce36d3d439bdd8.jpg"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
//    NSThread *myThread = [[NSThread alloc]initWithTarget:self selector:@selector(downLoadImg) object:nil];
//    [myThread start];
    NSLog(@"主线程%@",[NSThread currentThread]);
    [NSThread detachNewThreadSelector:@selector(downLoadImg) toTarget:self withObject:nil];
}
-(void)downLoadImg{
    NSLog(@"新线程:%@",[NSThread currentThread]);
    NSData *data = [[NSData alloc]initWithContentsOfURL:[NSURL URLWithString:imgUrl]];
    UIImage *image = [[UIImage alloc]initWithData:data];
    if (image) {
        //通知主线程更新UI
        [self performSelectorOnMainThread:@selector(updateUI:) withObject:image waitUntilDone:YES];
    }
}
-(void)updateUI:(UIImage*)image{
    self.myImageView.image = image;
}
- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

其中,线程间的通讯:通知主线程更新UI
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
除了更新主线程,也可以指定其他线程:
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait;




未完待续。


参考:http://www.cocoachina.com/industry/20140520/8485.html
说明:本笔记作为学习记录用,无意侵权。所有引用皆会在参考处说明。












0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:9086次
    • 积分:398
    • 等级:
    • 排名:千里之外
    • 原创:32篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条