文档章节

iOS多线程的初步研究(一)

MrBryant24
 MrBryant24
发布于 2014/04/25 10:42
字数 969
阅读 542
收藏 0

##iOS多线程的初步研究(一)

来源: http://www.cnblogs.com/sunfrog/p/3243230.html

NSThread <b>

对于多线程的开发,iOS系统提供了多种不同的接口,先谈谈iOS多线程最基础方面的使用。产生线程的方式姑且分两类,一类是显式调用,另一类是隐式调用。

#一、显式调用

  • 显示调用的类为NSThread。一般构造NSThread的线程对象可通过两种方式:

    • 初始化线程主方法:1.类方法.2.实例方法可以拿到线程对象,便于以后终止线程。

    • [NSThread detachNewThreadSelector:@selector(run:) toTarget:target withObject:obj];

    • NSThread *newThread = [[NSThread alloc] initWithTarget:target selector:@selector(run:) object:obj];

  • 定义NSThread的子类MyThread,然后实现main方法(即方法1中的run)。然后创建新对象:

    • MyThread *newThread = [[MyThread alloc] init];

    • 启动线程:[newThread start];

    • 终止线程:实际上没有真正提供终止线程的api,但有个方法可以方便地利用cancel方法; 它是改变线程运行的一个状态标志,我们可以这样来利用:

在main方法中这样实现线程循环

- (void)main

{

// 得到当前运行线程

while (![[NSThread currentThread] isCancelled])

{

    // thread loop

    [NSThread sleepForTimeInterval:1.0]; //等同于sleep(1);
    [newThread cancel]

}

// release resources of thread

}
  1. 这时如果调用[newThread cancel]; 就可以终止线程循环了。

  2. NSThread有个类方法exit是用于立即结束当前线程的运行(有点鲁莽),因为无法保证当前线程对资源的释放,所以不推荐使用


#二、隐式调用

###通过NSObject的Category方法调用:

1.在主线程中运行方法,wait表示是否阻塞这个方法的调用,如果为YES则等待主线程中运行方法结束。一般可用于在子线程中调用UI方法。

  • (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

2.在指定线程中执行,但该线程必须具备run loop

  • (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(id)arg waitUntilDone:(BOOL)wait;

3.隐含产生新线程。

  • (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;

<font color =red> 而且它们通过以下方法可以被终止: </font>

  • (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget selector:(SEL)aSelector object:(id)anArgument;

  • (void)cancelPreviousPerformRequestsWithTarget:(id)aTarget;

#五、线程执行顺序

通常UI需要显示网络数据时,可以简单地利用线程的执行顺序,避免显式的线程同步:

  1. UI线程调用

[threadObj performSelectorInBackground:@selector(loadData) withObject:nil];

  1. 子线程中回调UI线程来更新UI

     - (void)loadData
    
     {
    
     //从网络中获取数据响应
    
     //更新数据
    
      //回调主线程(即系UI线程)
    
      //uiObj 可以是TableView或者其他UI类
    
     [uiObj performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:YES];
    
     }
    

·也可以使用NSThread实现同样的功能,loadData相当于NSThread的main方法。·

本文转载自:http://www.cnblogs.com/sunfrog/p/3243230.html

共有 人打赏支持
MrBryant24
粉丝 1
博文 7
码字总数 3289
作品 0
广州
程序员
加载中

评论(1)

程序员__R
程序员__R
吊.
阿里潘多拉实验室成功越狱 iOS 12 系统

雷锋网(公众号:雷锋网)消息,9月18日凌晨,Apple(苹果)正式对外发布最新的 iOS 12系统,几小时后,其安全防护系统很快就被阿里安全潘多拉实验室安全专家攻破,成为全球首个完成 iOS 12 完...

郭佳
09/19
0
0
iOS源码补完计划--AFNetworking(二)

目录 前言 AFNetworkReachabilityManager.h AFNetworkReachabilityManager.m API注释Demo 参考资料 前言 AFNetworking源码第二篇 主要看了看AFNetworkReachabilityManager的内容 作为一个辅助...

kirito_song
05/16
0
0
BlackHat 2018 iOS越狱细节揭秘:危险的用户态只读内存

  议题概要   现代操作系统基本都已经在硬件级别(MMU)支持了用户态只读内存,只读内存映射在保证了跨进程间通信、用户态与内核间通信高效性的同时,也保证了其安全性。直到DirtyCOW漏洞...

FreeBuf
08/09
0
0
多伦多大学开发反面部识别系统 人脸识别率降至0.5%

多伦多大学开发反面部识别系统 人脸识别率降至0.5% 2018-06-06 13:30编辑: CuiTong分类:AI来源:青亭网 人工智能AI反面部识别 招聘信息: C++工程师 Cocos2d-x游戏客户端开发 iOS开发工程师...

CuiTong
06/06
0
0
如何判断你是合格的高级iOS开发工程师?

前言 随着移动互联网的高速发展泄洪而来,有意学习移动开发的人越来越多了,竞争也是越来越大,需要学习的东西很多。如何才能在激烈的移动开发者竞争中一枝独秀,成为一名真正合格的高级iOS...

_小迷糊
05/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Shiro | 实现权限验证完整版

写在前面的话 提及权限,就会想到安全,是一个十分棘手的话题。这里只是作为学校Shiro的一个记录,而不是,权限就应该这样设计之类的。 Shiro框架 1、Shiro是基于Apache开源的强大灵活的开源...

冯文议
今天
1
0
linux 系统的运行级别

运行级别 运行级别 | 含义 0 关机 1 单用户模式,可以想象为windows 的安全模式,主要用于修复系统 2 不完全的命令模式,不含NFS服务 3 完全的命令行模式,就是标准的字符界面 4 系统保留 5 ...

Linux学习笔记
今天
2
0
学习设计模式——命令模式

任何模式的出现,都是为了解决一些特定的场景的耦合问题,以达到对修改封闭,对扩展开放的效果。命令模式也不例外: 命令模式是为了解决命令的请求者和命令的实现者之间的耦合关系。 解决了这...

江左煤郎
今天
3
0
字典树收集(非线程安全,后续做线程安全改进)

将500W个单词放进一个数据结构进行存储,然后进行快速比对,判断一个单词是不是这个500W单词之中的;来了一个单词前缀,给出500w个单词中有多少个单词是该前缀. 1、这个需求首先需要设计好数据结...

算法之名
昨天
15
0
GRASP设计模式

此文参考了这篇博客,建议读者阅读原文。 面向对象(Object-Oriented,OO)是当下软件开发的主流方法。在OO分析与设计中,我们首先从问题领域中抽象出领域模型,在领域模型中以适当的粒度归纳...

克虏伯
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部