IOS开发 Application Kit框架的线程安全
以下部分介绍了Application Kit框架的线程安全。
非线程安全类
以下这些类和函数通常是非线程安全的。大部分情况下,你可以在任何线程使用这些类,只要你在同一时间只有一个线程使用它们。查看这些类的文档来获得更多的详细信息。
- NSGraphicsContext。多信息,参见“NSGraphicsContext 限制”。
- NSImage.更多信息,参见“NSImage 限制”。
- NSResponder。
- NSWindow和所有它的子类。更多信息,参见“Window 限制
只能用于主线程的类
以下的类必须只能在应用的主线程使用。
- NSCell和所有它的子类。
- NSView和所有它的子类。更多信息,参见“NSView 限制”。
Window 限制
你可以在辅助线程创建一个window。Application Kit确保和window相关的数据结构在主线程释放来避免产生条件。在同时包含大量windows的应用中,window对象有可能会发生泄漏。
你也可以在辅助线程创建modal window。在主线程运行modal loop时,Application Kit阻塞辅助线程的调用。
事件处理例程限制
应用的主线程负责处理事件。主线程阻塞在NSApplication的run方法,通常该方法被包含在main函数里面。在Application Kit继续工作时,如果其他线程被包含在事件路径,那么操作有可能打乱顺序。比如,如果两个不同的线程负责关键事件,那么关键事件有可能不是按照顺序到达。通过让主线程来处理事件,事件可以被分配到辅助线程由它们处理。
你可以在辅助线程里面使用NSApplication的postEvent:atStart方法传递一个事件给主线程的事件队列。然而,顺序不能保证和用户输入的事件顺序相同。应用的主线程仍然辅助处理事件队列的事件。
绘画限制
Application Kit在使用它的绘画函数和类时通常是线程安全的,包括NSBezierPath和NSString类。关于使用这些类的详细信息,在以下各部分介绍。关于绘画的额外信息和线程可以查看Cocoa Drawing Guide。
a) NSView限制
NSView通常是线程安全的,包含几个异常。你应该仅在应用的主线程里面执行对NSView的创建、销毁、调整大小、移动和其他操作。在其他辅助线程里面只要你把绘画的代码放在lockFocusIfCanDraw和unlockFocus方法之间也是线程安全的。
如果应用的辅助线程想要告知主线程重绘视图,一定不能在辅助线程直接调用display,setNeedsDisplay:,setNeedsDisplayInRect:,或setViewsNeedDisplay:方法。相反,你应该给给主线程发生一个消息让它调用这些方法,或者使用performSelectorOnMainThread:withObject:waitUntilDone:方法。
系统视图的图形状态(gstates)是基于每个线程不同的。使用图形状态可以在单线程的应用里面获得更好的绘画性能,但是现在已经不是这样了。不正确使用图形状态可能导致主线程的绘画代码更低效。
b) NSGraphicsContext 限制
NSGraphicsContext类代表了绘画上下文,它由底层绘画系统提供。每个NSGraphicsContext实例都拥有它独立的绘画状态:坐标系统、裁剪、当前字体等。该类的实例在主线程自动创建自己的NSWindow实例。如果你在任何辅助线程执行绘画操作,需要特定为该线程创建一个新的NSGraphicsContext实例。
如果你在任何辅助线程执行绘画,你必须手工的刷新绘画调用。Cocoa不会自动更新辅助线程绘画的内容,所以你当你完成绘画后需要调用NSGraphicsContext的flusGrahics方法。如果你的应用程序只在主线程绘画,你不需要刷新绘画调用。
c) NSImage限制
线程可以创建NSImage对象,把它绘画到图片缓冲区,还可以把它传递给主线程来绘画。底层的图片缓存被所有线程共享。关于图片和如何缓存的更多信息,参阅Ccocoa Drawing Guide。
IOS开发 Application Kit框架的线程安全的更多相关文章
- iOS 开发之照片框架详解(2)
一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...
- iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)
本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...
- iOS 开发之照片框架详解
转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework.html 一. 概要 在 iOS 设备中,照片和视频是相当重 ...
- iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)
转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...
- ReactiveCocoa - iOS开发的新框架
本文转载至 http://www.infoq.com/cn/articles/reactivecocoa-ios-new-develop-framework ReactiveCocoa(其简称为RAC ...
- iOS 开发之照片框架详解(1)
http://kayosite.com/ios-development-and-detail-of-photo-framework.html/comment-page-1 一. 概要 在 iOS 设备 ...
- 【iOS开发】Alamofire框架的使用二 高级用法
Alamofire是在URLSession和URL加载系统的基础上写的.所以,为了更好地学习这个框架,建议先熟悉下列几个底层网络协议栈: URL Loading System Programming ...
- iOS开发--SQLite重要框架FMDB的使用
什么是FMDB: FMDB是一个和iOS的SQLite数据库操作相关的第三方框架.主要把C语言操作数据库的代码用OC进行了封装.使用者只需调用该框架的API就能用来创建并连接数据库,创建表,查询等. ...
- 【iOS开发】Alamofire框架的使用一基本用法
Alamofire框架的使用一 —— 基本用法 对于使用Objective-C的开发者,一定非常熟悉AFNetworking这个网络框架.在苹果推出的Swift之后,AFNetworking的作者专门 ...
随机推荐
- Mybatis <if>标签使用注意事项
在<if>标签的test中,不能写成“name !='aa'” , 会报错### Error querying database. Cause: java.lang.NumberForma ...
- 源码编译nginx
[root@localhost local]# yum -y install pcre pcre-devel#解压nginx源码包[root@localhost local]# tar -zxvf / ...
- Spring核心技术AOP案例
在SpringAOP开发之前,首先要了解一下这几个概念.Target:目标,通俗的说对哪个类做增强,那个类就是目标.JoinPoint:连接点,在实际开发中可以被增强的点.PointCut:切入点,在 ...
- mybaties mapping中if..else
<select id="selectSelective" resultMap="xxx" parameterType="xxx"> ...
- springMVC数据回显
1.web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...
- python 匹配中文和英文
在处理文本时经常会匹配中文名或者英文word,python中可以在utf-8编码下方便的进行处理. 中文unicode编码范围[\u4e00-\u9fa5] 英文字符编码范围[a-zA-Z] 此时匹配 ...
- 《用 Python 学微积分》笔记 1
<用 Python 学微积分>原文见参考资料 1. 1.多项式 f(x)=x3-5x2+9 def f(x): return x**3 - 5*x**2 + 9 print f(3) pr ...
- zoom:1;
zoom:1;属性是IE浏览器的专有属性,可以设置或检索对象的缩放比例.触发ie的hasLayout属性.清除浮动.清除magin的重叠等. 注意:它未通过W3C验证.
- TCP_DB_中间件_数据打包格式
ZC: 这里约定的是,C和S之间 传输的TCP数据包的格式 1.TCP数据包 打包格式 1.1.TCP包长度(int32) + TCP包序号(int32) + TCP包类型(int32) + TCP包 ...
- 用svg实现不规则形状
像这种弧形,用纯html和css很难写,但是用svg就简单多了. 可以用作图工具画出一个弧形,然后导成svg格式.在页面中,下面的白块就是div+svg构成 mixin svgCard(...cont ...