iOS多线程编程

一、什么是多线程

a)               进程是运行着的程序;

b)              一个进程至少包含一个线程(主线程,界面更新UIKit);

c)               线程共用程序内存,但每个线程都有自己的stack空间;

d)              多线程就是多个执行流,可以同步或异步,是一种并发执行技术。

二、iOS中实现方法

a)               pthread:iOS是某个版本的Mac OS所以可以使用unix中的线程方法;

b)              NSThread:轻量级多线程技术,需要自己管理线程的生命周期;

c)               NSOperation &NSOperationQueen:相比NSThread技术,使用更加简单,不需要线程管理,直接使用;

d)              GCD(Grand Central Dispatch):Ios4.0版本推出,用于取代NSThread和NSOperation,简单方便,功能强大,推荐使用。

三、NSThread

注:可继承NSThread重写main方法

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

b)              - (instancetype)initWithTarget:(id)target selector:(SEL)selector object:(nullable id)argument NS_AVAILABLE(10_5, 2_0);

c)               - (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg NS_AVAILABLE(10_5, 2_0);//属于NSObject

d)              /*更新主线程UI*/- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;//属于NSObject

e)               加锁:NSLock/NSCondition

四、NSOperation& NSOperationQueen

a)               NSInvocationOperation/NSBlockOperation/NSOperation/NSOperationQueen

b)              可继承NSOperation实现main方法

c)               只要把NSOperation的对象放到NSOperationQueen中即会进行多线程的运行

d)              并发执行/非并发执行

e)               -(void)start

f)                 – (BOOL)isConcurrent

g)               – (BOOL)isFinishd

h)              – (BOOL)isExecuting

i)                  – (void)main

五、GCD(GrandCentral Dispatch)

a)               GCD是iOS在4.0版本后推出的,用于取代以上方式的多线程,其可根据程序的任务队列合理分配核去处理,充分利用硬件多核,效率高。

b)              概念:任务和队列(串行队列/并行队列/同步任务/异步任务)

c)               api:dispatch_queue_t/dispatch_queue_create/dispatch_get_main_queue/dispatch_get_global_queue/dispatch_sync/dispatch_async/dispatch_group_t/dispatch_group_create/dispatch_group_async/dispatch_group_notify

示例代码:


//
//  ViewController.m
//  ThreadDemo
//
//  Created by LiLeo on 16/6/24.
//  Copyright © 2016年 LeoLi. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

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

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSString * string = @"http://c.hiphotos.baidu.com/image/pic/item/ae51f3deb48f8c54469d4dc23e292df5e1fe7f95.jpg";
    /*NSThread的三种方法*/
//    [NSThread detachNewThreadSelector:@selector(downloadImageByUrl:) toTarget:self withObject:string];
//    NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(downloadImageByUrl:) object:string];
//    [thread start];
    //[self performSelectorInBackground:@selector(downloadImageByUrl:) withObject:string];
    
    /*NSOperation的实现方法*/
    /*
     * 若要继承NSOperation有两种方式,只实现main方法的是非同步的,同步的需要实现:start/isConcurrent/isFinished
     */
//    NSInvocationOperation * operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downloadImageByUrl:) object:string];
//    NSOperationQueue * queue = [[NSOperationQueue alloc] init];
//    [queue addOperation:operation];
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        NSURL * url = [NSURL URLWithString:string];
        NSData * data = [NSData dataWithContentsOfURL:url];
        UIImage * image = [[UIImage alloc] initWithData:data];
        dispatch_async(dispatch_get_main_queue(), ^{
            _imageView.image = image;
        });
    });
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (void)downloadImageByUrl:(NSString *)string {
    NSURL * url = [NSURL URLWithString:string];
    NSData * data = [[NSData alloc] initWithContentsOfURL:url];
    UIImage * image = [UIImage imageWithData:data];
    [self performSelectorOnMainThread:@selector(updateImage:) withObject:image waitUntilDone:YES];
}

- (void)updateImage:(UIImage *)image {
    _imageView.image = image;
}
@end


六、参考文档

a)               http://mobile.51cto.com/iphone-403490.htm

b)              http://blog.csdn.net/totogo2010/article/details/8010231

c)               http://www.cnblogs.com/wendingding/p/3805088.html

d)              http://www.cocoachina.com/ios/20150731/12819.html           

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬李先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值