黑马程序员--日记一--IOS多线程学习
来源:互联网 发布:淘宝客淘口令前面描述 编辑:程序博客网 时间:2024/04/25 23:54
在Object-c中,常用的多线程处理类分别为NSThread和NSOperationQueue。使用这两个类处理多线程,让复杂的多线程处理变得简单高效。
一、NSThread类
苹果公司的Cocoa框架共支持三种多线程机制,分别为NSThread、GCD(Grand Central Dispatch)(iOS4 才开始支持)、Cocoa NSOperatio。NSThree是官方推荐的线程处理方式,它在处理机制上,需要开发者负责手动管理Thread的生命周期,包括子线程与主线程之间的同步等。线程共享同一应用程序的部分内存空间,它们拥有对数据相同的访问权限。你得协调多个线程 对同一数据的访问,一般做法是在访问之前加锁,这会导致一定的性能开销。在 iOS 中我们可以使用多种形式的 thread。初次接触的读者也许会觉得生涩,但事实上NSThread类已经提供了完善的接口,在使用方式上并不会太难。使用NSTread管理线程,主要的步骤如下。
1)声明一个NSCondition同步锁;
2)声明若干个NSThread子线程;
3)指定NSThread子线程的目标指行方法(可以在构造函数中指定);
4)设置子线程的名称;
5)star启动子线程。
其中,子线程的执行方法一般只需要一个共同方法即可(可以通过线程名,分辨当前的执行线程)。下面通过代码演示NSThread类的使用。假设我们需要下载网络图片,在非异步形式的情况下,IOS界面必须等到图片下载完毕后,UI才会反应。这时利用多线程就可以达到异步下载的效果。
[NSThread detachNewThreadSelector:@selector(myThreadMainMethod:) toTarget:self withObject:nil];NSThread* myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil];[myThread start]; //启动线程
这两种方式的区别是:前一种一调用就会立即创建一个线程来做事情;而后一种虽然你 alloc 了也 init了,但是要直到我们手动调用 start 启动线程时才会真正去创建线程。这种延迟实现思想在很多跟资源相关的地方都有用到。后一种方式我们还可以在启动线程之前,对线程进行配置,比如设置 stack 大小,线程优先级。
此外还有一种间接的方式:利用NSObject的方法
performSelectorInBackground:withObject: 来创建一个线程:
[myObj performSelectorInBackground:@selector(myThreadMainMethod) withObject:nil]; //在后台运行某一个方法
其效果与 NSThread 的 detachNewThreadSelector:toTarget:withObject: 是一样的。
二、NSOperationQueue类
如果需要让线程同时并行运行多个,可以将线程加入队列(Queue)中,NSOperationQueue类就是一个线程队列管理类,他提供了线程并行、队列的管理。可以认为NSOperationQueue就是一个线程管理器,通过addOperations方法,我们可以一次性把多个(数组形式)线程添加到队列中。同时,NSOperationQueue允许通过setMaxConcurrentOperationCount方法设置队列的并行(同一时间)运行数量。NSOperationQueue的使用步骤如下。
1)声明一个NSOperationQueue对象;
2)声明若干个NSInvocationOperation子线程对象,并指定回调方法;
3)将NSInvocationOperation子线程添加到数组;
4)把数组赋给NSOperationQueue类中的addOperations方法;
5) 实现回调方法;
6)在回调方法中实现performSelectorOnMainThread方法,更新主线程上的界面UI元素。
并发执行你需要重载如下4个方法
//执行任务主函数,线程运行的入口函数
-(void)start
//是否允许并发,返回YES,允许并发,返回NO不允许。默认返回NO
-(BOOL)isConcurrent
- (BOOL)isExecuting
//是否已经完成,这个必须要重载,不然放在放在NSOperationQueue里的NSOpertaion不能正常释放。
- (BOOL)isFinished
比如TestNSOperation:NSOperaion 重载上述的4个方法,
声明一个NSOperationQueue
NSOperationQueue *queue = [[[NSOperationQueue alloc ] init]autorelease];[queue addOperation:testNSoperation];
它会自动调用TestNSOperation里的start函数,如果需要多个NSOperation,你需要设置queue的一些属性,如果多个NSOperation之间有依赖关系,也可以设置,具体可以参考API文档。
(2)非并发执行
-(void)main
只需要重载这个main方法就可以了。
- 黑马程序员--日记一--IOS多线程学习
- 黑马程序员学习日记----多线程(一)
- 黑马程序员学习日记--多线程
- 黑马程序员_学习日记三_多线程一
- 黑马程序员学习日记一
- 黑马程序员-iOS学习日记(一)OC基本语法
- 【黑马程序员】多线程学习日记1
- 黑马程序员学习日记----多线程(二)
- 黑马程序员学习日记(1)--初学多线程
- 黑马程序员-----java多线程(学习日记)
- 黑马程序员--多线程学习日记
- 黑马程序员 学习日记(一)
- 黑马程序员 学习日记(一)
- 黑马程序员 学习日记 解(一)
- 黑马程序员学习日记--javaApI(一)
- 黑马程序员-学习日记 (一)
- 黑马程序员_日记11_多线程(一)
- 黑马程序员——学习日记之--多线程学习总结
- 黑马程序员----objective-C 类与对象基础篇(二)【声明与实现,方法与函数及常见错误】
- 青蛙跳台阶(2XN骨牌问题)
- JVM如何理解Java泛型类
- 看美剧学习英语
- python decorator
- 黑马程序员--日记一--IOS多线程学习
- 判断一个单链表是否有环
- win7下生成github的公匙
- nyoj题目477:A+B Problem III
- 黑马程序员-OC学习日记三之点语法小结
- 覆盖丰盛的
- shell中的算术运算总结
- hbase学习笔记(1)-表创建
- MacBook 系统自带壁纸