iOS学习笔记--02 多线程

原创 2015年11月19日 17:46:47

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
说明:本笔记作为学习记录用,无意侵权。所有引用皆会在参考处说明。












版权声明:本文为博主原创文章,未经博主允许不得转载。

java多线程学习笔记(一)!更好的理解多线程

1.线程的创建 之前知道java中一个多线程的创建方法是继承Thread类或者实现Runable接口,但是看不懂下面这种创建线程的方法 第一种 new Thread(new Runnable()...
  • a347911
  • a347911
  • 2016年11月15日 09:56
  • 452

学习笔记 02 --- Java多线程

学习笔记(20170106)--- Java多线程 02 学习笔记(20170105)---Java多线程 01 synchronized关键字: 脏读:在多线程中,难免会出现多个线...
  • tianya3530
  • tianya3530
  • 2017年01月10日 10:14
  • 227

c++ 多线程学习笔记(一)

Handle CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程内核对象的安全属性,一般传入NULL表示使用默认设置 SIZE_T...
  • cwbguaijie
  • cwbguaijie
  • 2017年11月10日 15:32
  • 33

(19)Java学习笔记——多线程02

线程间通讯 多个线程在处理同一资源,但是任务却不同。
  • xiexiecm
  • xiexiecm
  • 2017年01月20日 21:36
  • 88

java学习笔记(九)----多线程

class ThreadDemo1{ public static void main(String[] args)  { new TestThread().start(); //用start()默认去...
  • fhx007
  • fhx007
  • 2006年05月31日 13:00
  • 1486

OSAL操作系统实验学习笔记05

OSAL操作系统实验的按键实现 按键有两种工作模式:轮询(Poll)和中断(Interrupt) 轮询 按键处理函数是HalKeyPoll (void),这个函数会在HAL的事件处理Hal_Pr...
  • Mr_White01
  • Mr_White01
  • 2017年03月22日 14:48
  • 302

Lightroom预设:VSCO Mobile Presets 02 for Mac(仿真VSCO滤镜-人像日系婚礼) V1.0已激活版

详见博客:http://003e5258-ab01-4b8c-83e6-a78718399eb3.coding.io/2018/02/08/lightroom预设:vsco-mobile-preset...
  • romances
  • romances
  • 2018年02月08日 15:07
  • 22

C#学习笔记 线程同步

多个线程同时操作一个数据的话,可能会发生数据的错误。这个时候就需要进行线程同步了。用户模式同步构造易变构造CLR保证4字节以下的基本类型的读写是原子性的,也就是说这些变量的值都会一次性被读取或者写入。...
  • u011054333
  • u011054333
  • 2016年01月10日 23:31
  • 416

[读书笔记]多线程学习笔记

几乎所有的操作系统都支持同时运行多个任务,一个任务通常就是一个程序,每个运行的程序就是一个进程。当一个程序运行时,内部可能包含了多个顺序执行流,每个执行流就是一个线程。线程和进程所有运行中的任务通常对...
  • CodeEmperor
  • CodeEmperor
  • 2016年02月07日 12:12
  • 941

多线程02

###25.01_多线程(单例设计模式)(掌握) * 单例设计模式:保证类在内存中只有一个对象。 * 如何保证类在内存中只有一个对象呢? * (1)控制类的创建,不让其他类来创建本类的对象。pri...
  • Ling695343425
  • Ling695343425
  • 2017年05月10日 11:21
  • 209
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS学习笔记--02 多线程
举报原因:
原因补充:

(最多只允许输入30个字)