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












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

多线程02:《疯狂Java讲义》学习笔记——线程的创建和启动

(1)继承Thread类创建线程类;(2)实现Runnable接口创建线程类;(3)使用Callable和Future创建线程;(4)创建线程的三种方式对比...

UNIX多线程学习笔记

  • 2011年08月15日 13:46
  • 80KB
  • 下载

java学习笔记2(多线程)

  • 2011年08月30日 19:02
  • 210KB
  • 下载

iOS学习笔记1-多线程GCD与block

学习IOS也有两三个月了,今天来总结下学习GCD的知识点,希望大家多多指教:1.GCD简介以及block GCD:Grand Central Dispatch或者GCD,是一套low level ...

IOS学习笔记 多线程篇(一) 概述

IOS提供三种多线程方法,他们分别是: NSThread。Grand Central Dispatch,俗称GCD。NSOperation。 这三种方法抽象程度逐级提高,抽象度越高,越容易使用...

疯狂iOS讲义(下)——多线程第二天学习笔记

注意:iOS规定,只能在UI线程中修改UI控件的属性。 【原因:加入程序允许任意子线程访问。修改UI控件的属性,就需要对多个新线程的并发访问进行同步控制;否则,多个线程将会破坏UI控件内部状态的...

iOS学习笔记——多线程

iOS的多线程,分为由以下三种实现方式:       1、 Thread      2、 Cocoa operations      3,、Grand Central Dispatch (GCD...

多线程学习笔记与学习

  • 2011年07月04日 08:28
  • 85KB
  • 下载

iOS学习笔记08—多线程概述

iOS学习笔记08—多线程概述 一、概述 线程(thread):用于指代独立执行的代码段。 进程(process):用于指代一个正在运行的可执行程序,它可以包含多个线程。 任务(t...
  • jjunjoe
  • jjunjoe
  • 2012年12月19日 15:44
  • 3403

iOS 学习笔记 多线程

一、iOS多线程 iOS多线程开发有三种方式: NSThreadNSOperationGCD iOS在每个进程启动后都会创建一个主线程,更新UI要在主线程上,所以也称为UI线程,是其...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS学习笔记--02 多线程
举报原因:
原因补充:

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