多线程网络

来源:互联网 发布:网络角色游戏排行榜 编辑:程序博客网 时间:2024/05/18 03:29
通知和代理的区别:    通知是多对多,代理是一对一         都是用于对象间的通信

堆区:存放对象
栈区:存放基本类型的数据    每个线程对应一块栈区,主线程(1M)   子线程512K

多线程 网络:

三种多线程技术:
(1)GCD —— Grand Central Dispatch
(2)NSOperation/NSOperationQueue:限制最大并发数量、操作之间的依赖关系
(3)NSThread



线程:可并发执行的,拥有最小系统资源,共享进程资源的基本调度单位。

操作队列(NSOperation)是并发编程的首选工具

在iOS开发中,所有UI的更新工作,都必须在主线程上执行!

除非将程序杀掉,否则主线程的工作永远不会结束!


dispatch_queue_t q = dispatch_queue_create("cn.itcast.gcddemo", DISPATCH_QUEUE_SERIAL);

    

    // 非ARC开发时,千万别忘记release

//    dispatch_release(q);



串行队列:  同步<在一个线程(主线程)上顺序执行>      异步<会新建一个子线程,顺序执行>

并行队列:  同步<在一个线程(主线程)上顺序执行>      异步<会新建多个子线程,无序执行>

全局队列:  是一个并行队列

主队列:      是一个串行队列(做同步操作会死锁)


队列的特点是先进先出,负责调度任务在哪个线程上执行,以及执行的时间


在串行队列的同步操作中嵌套同步操作会导致死锁,嵌套之前的代码会执行

主队列中添加的同步操作永远不会被执行,会死锁,因为同步任务会一直等待主线程结束

无论什么队列和什么任务,线程的创建和回收不需要程序员参与。

线程的创建回收工作是由队列负责的

不能将一个操作添加到多个队列中

自定义队列添加的任务,相当于GCD的并行队列,异步任务

[self.myQueue addOperation:op];

添加依赖  [op4 addDependency:op3];


// 在iOS中,GCD和NSOperation新建线程时,会自动在新线程中创建自动释放池

// 但是,使用NSThread的时候,系统不会自动创建自动释放池


    // 在使用NSThread以及NSObject封装的多线程方法,如果涉及到对象的分配,需要手动添加autoreleasepool,否则会出现内存泄露

    @autoreleasepool {

        NSLog(@"%@", [NSThread currentThread]);

        //    [NSThread sleepForTimeInterval:2.0f];    休眠2秒

        

        // waitUntilDone = YES表示等待selector方法执行完毕

        [self performSelectorOnMainThread:@selector(setImage:) withObject:[UIImage imageNamed:imageName] waitUntilDone:NO];

        

    }



自动释放池的工作原理
(1)标记为autorelease的对象在出了作用域范围后,会被添加到最近一次创建的自动释放池中
(2)当自动释放池被销毁或耗尽时,会向自动释放池中的所有对象发送release消息
(3)每个线程都需要有@autoreleasepool,否则可能会出现内存泄漏,使用NSThread多线程技术,不会为后台线程创建自动释放池,


GCD公开有5个不同的队列:一个运行在主线程中的主队列,3 个不同优先级的后台队列,以及一个优先级更低的后台队列(用于 I/O)


实际运用中,一般可以这样来写,常见的网络请求数据多线程执行模型:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

  //子线程中开始网络请求数据

  //更新数据模型

  dispatch_sync(dispatch_get_main_queue(), ^{

    //在主线程中更新UI代码

  });

});

程序的后台运行和UI更新代码紧凑,代码逻辑一目了然。


所有的自定义队列,都是在子线程上运行的


操作依赖:

[op2 addDependency:op1];



单例的实现步骤:

重写allocWithZone方法
allocWithZone方法是对象分配内存空间时,最终会调用的方法,重写该方法,保证只会分配一个内存空间
建立sharedXXX类方法,便于其他类访问

+ (id)allocWithZone:(struct _NSZone *)zone

{

    static Ticket *instance;

    static dispatch_once_t onceToken;

    //dispatch_once是线程安全的,能够做到在多线程的环境下Block中的代码只会被执行一次

    dispatch_once(&onceToken, ^{

        instance = [super allocWithZone:zone];

    });  

    return instance;

}




0 0
原创粉丝点击