ios多线程初步研究
来源:互联网 发布:软件测试培训靠谱吗 编辑:程序博客网 时间:2024/06/13 21:09
对于多线程的开发,iOS系统提供了多种不同的接口,先谈谈iOS多线程最基础方面的使用。产生线程的方式姑且分两类,一类是显式调用,另一类是隐式调用。一、显示调用的类为NSThread。一般构造NSThread的线程对象可通过两种方式:1. 初始化线程主方法:[NSThread detachNewThreadSelector:@selector(run:) toTarget:target withObject:obj];//类方法或NSThread *newThread = [[NSThread alloc] initWithTarget:target selector:@selector(run:) object:obj]; //实例方法可以拿到线程对象,便于以后终止线程。2. 定义NSThread的子类MyThread,然后实现main方法(即方法1中的run)。然后创建新对象:MyThread *newThread = [[MyThread alloc] init];启动线程:[newThread start];终止线程:实际上没有真正提供终止线程的api,但有个cancel方法可以利用; 它改变线程运行的一个状态标志,我们可以这样来利用:先在run:或main方法中这样实现线程循环:- (void)main{ // thread init while (![[NSThread currentThread] isCancelled]) { // thread loop [NSThread sleepForTimeInterval:1.0]; //等同于sleep(1); } // release resources of thread} 这时如果调用[newThread cancel]; 就可以终止线程循环了。 NSThread有个类方法exit是用于立即结束当前线程的运行(不安全),因为无法保证当前线程对资源的释放,所以不推荐使用。像java中Thread的stop方法也被弃用一样,因为不安全。二、隐式调用通过NSObject的Category方法调用,罗列如下:- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; //在主线程中运行方法,wait表示是否阻塞这个方法的调用,如果为YES则等待主线程中运行方法结束。一般可用于在子线程中调用UI方法。- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait; //在指定线程中执行,但该线程必须具备run loop。- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg; //隐含产生新线程。三、NSThread的其它一些常用的方法创建的线程是非关联线程(detached thread),即父线程和子线程没有执行依赖关系,父线程结束并不意味子线程结束。1. + (NSThread *)currentThread; //获得当前线程2. + (void)sleepForTimeInterval:(NSTimeInterval)ti; //线程休眠3. + (NSThread *)mainThread; //主线程,亦即UI线程了4. - (BOOL)isMainThread; + (BOOL)isMainThread; //当前线程是否主线程5. - (BOOL)isExecuting; //线程是否正在运行6. - (BOOL)isFinished; //线程是否已结束四、一些非线程调用(NSObject的Category方法)即在当前线程执行,注意它们会阻塞当前线程(包括UI线程):- (id)performSelector:(SEL)aSelector;- (id)performSelector:(SEL)aSelector withObject:(id)object;- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2; 以下调用在当前线程延迟执行,如果当前线程没有显式使用NSRunLoop或已退出就无法执行了,需要注意这点:- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes;- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;而且它们可以被终止:+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument;+ (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;五、线程执行顺序通常UI需要显示网络数据时,可以简单地利用线程的执行顺序,避免显式的线程同步:1. UI线程调用[threadObj performSelectorInBackground:@selector(loadData) withObject:nil];2. 子线程中回调UI线程来更新UI- (void)loadData{ //query data from network //update data model //callback UI thread [uiObj performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:YES];}也可以使用NSThread实现同样的功能,loadData相当于NSThread的main方法。
0 0
- ios多线程初步研究
- iOS 多线程初步研究-NSThread
- iOS 多线程初步研究-锁
- iOS 多线程初步研究-NSRunLoop
- iOS 多线程初步研究-NSTimer
- iOS 多线程初步研究-NSOperation
- iOS 多线程初步研究-NSTimer
- iOS多线程的初步研究
- IOS多线程的初步研究
- iOS多线程的初步研究(一)
- iOS多线程的初步研究 dispatch队列
- iOS多线程的初步研究(-)-- NSTimer
- iOS多线程的初步研究-- 锁
- iOS多线程的初步研究(一)
- 转转 iOS多线程的初步研究
- iOS多线程的初步研究(一)-- NSThread
- iOS多线程的初步研究(二)-- 锁
- iOS多线程的初步研究(三)-- NSRunLoop
- Sql Server, 查询数据库中表的大小
- 《C++ Primer》 Stanley B. Lippman 第五版 练习题
- c源文件中要包含自己的头文件
- 1.1.2优化与执行
- 要学会利竞争与工具来宣传自己
- ios多线程初步研究
- [ecshop 经验] 68ecshop 肖金东版本 会员名乱码问题
- Node.js中的数组和javascript中的数组使用区别
- android原生进行第三方商城进行评论以及分享给别的APP(微信、微博、扣扣)
- Java 写文件:FileOutputStream
- 背景图铺满全屏代码
- laravel 模板view 中生成地址
- Mac下安装使用apktool,jd-gui进行反编译
- 微异构Embree照片级光线追踪解决方案