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多线程学习笔记

iOS多线程这里是资源地址几种常用的多线程:NSThread可以直接控制线程对象,可以获取当前线程类,可以知道当前线程的各种属性。用法://创建 NSThread *thread = [[NSThre...

iOS学习笔记——多线程(简单售票系统)

进程是系统资源管理的最小单位。线程是程序执行的最小单位。多线程是一个进程里包含多个线程。一个进程数据会加载到一个内存区间中,其中的线程共享相同的内存空间。各个进程的地址是独立的,只有进程能刷新UI、更...

《Objective-C高级编程 iOS与OS X多线程和内存管理》学习笔记——第一章自动引用计数

第一章:自动引用计数 一、什么是自动引用计数 二、内存管理/引用计数 1、概要 2、内存管理的思考方式 3、alloc/retain/release/dealloc实现 4、苹果的实现 5、aut...

iOS 学习笔记 --- 多线程基础(4)--- NSOperation

NSOperation 简介 实现多线程步骤先将需要执行的操作封装到一个NSOperation对象中 然后将NSOperation对象添加到NSOperationQueue中 系统会自动将NSOper...

iOS 多线程学习笔记 —— dispatch_async在serial queue中的异常

以下是学习了别人的文档后,对自己不太理解的知识点的一点总结。 论点: 同步和异步只是相对同一个队列来说的,决定一个队列中是一个线程还是多个线程 串行和并行队列则决定在这个队列中,如果有多个线程的话(...

iOS学习笔记03—多线程

在讲多线程之前,先讲下几个线程的术语: 线程(线程)用于指代独立执行的代码段。进程(process)用于指代一个正在运行的可执行程序,它可以包含多个线程。任务(task)用于指代抽象的概念,表示需...
  • jr773
  • jr773
  • 2013-08-07 16:47
  • 693

IOS学习笔记 多线程基本理论基础(1)

1、进程:一个运行的程序就是一个进程。  一个进程至少包含一个线程。系统的每一个进程都有自己独立的虚拟内存空间。          同一个进程中的多个线程则共用进程的内存空间。   2、线程:就是要执...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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