以下部分介绍了Application Kit框架的线程安全。

非线程安全类

以下这些类和函数通常是非线程安全的。大部分情况下,你可以在任何线程使用这些类,只要你在同一时间只有一个线程使用它们。查看这些类的文档来获得更多的详细信息。

  • NSGraphicsContext。多信息,参见“NSGraphicsContext 限制”。
  • NSImage.更多信息,参见“NSImage 限制”。
  • NSResponder。
  • NSWindow和所有它的子类。更多信息,参见“Window 限制

只能用于主线程的类

以下的类必须只能在应用的主线程使用。

  1. NSCell和所有它的子类。
  2. 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框架的线程安全的更多相关文章

  1. iOS 开发之照片框架详解(2)

    一. 概况 本文接着 iOS 开发之照片框架详解,侧重介绍在前文中简单介绍过的 PhotoKit 及其与 ALAssetLibrary 的差异,以及如何基于 PhotoKit 与 AlAssetLib ...

  2. iOS 开发之照片框架详解之二 —— PhotoKit 详解(下)

    本文链接:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-three.html 这里接着前文<iOS ...

  3. iOS 开发之照片框架详解

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework.html 一. 概要 在 iOS 设备中,照片和视频是相当重 ...

  4. iOS 开发之照片框架详解之二 —— PhotoKit 详解(上)

    转载自:http://kayosite.com/ios-development-and-detail-of-photo-framework-part-two.html 一. 概况 本文接着 iOS 开 ...

  5. ReactiveCocoa - iOS开发的新框架

    本文转载至 http://www.infoq.com/cn/articles/reactivecocoa-ios-new-develop-framework ReactiveCocoa(其简称为RAC ...

  6. iOS 开发之照片框架详解(1)

    http://kayosite.com/ios-development-and-detail-of-photo-framework.html/comment-page-1 一. 概要 在 iOS 设备 ...

  7. 【iOS开发】Alamofire框架的使用二 高级用法

    Alamofire是在URLSession和URL加载系统的基础上写的.所以,为了更好地学习这个框架,建议先熟悉下列几个底层网络协议栈: URL Loading System Programming ...

  8. iOS开发--SQLite重要框架FMDB的使用

    什么是FMDB: FMDB是一个和iOS的SQLite数据库操作相关的第三方框架.主要把C语言操作数据库的代码用OC进行了封装.使用者只需调用该框架的API就能用来创建并连接数据库,创建表,查询等. ...

  9. 【iOS开发】Alamofire框架的使用一基本用法

    Alamofire框架的使用一 —— 基本用法 对于使用Objective-C的开发者,一定非常熟悉AFNetworking这个网络框架.在苹果推出的Swift之后,AFNetworking的作者专门 ...

随机推荐

  1. cogs 896. 圈奶牛

    ★★☆   输入文件:fc.in   输出文件:fc.out   简单对比 时间限制:1 s   内存限制:128 MB 描述 农夫约翰想要建造一个围栏用来围住他的奶牛,可是他资金匮乏.他建造的围栏必 ...

  2. RabbitMQ入门(3)——发布/订阅(Publish/Subscribe)

    在上一篇RabbitMQ入门(2)--工作队列中,有一个默认的前提:每个任务都只发送到一个工作人员.这一篇将介绍发送一个消息到多个消费者.这种模式称为发布/订阅(Publish/Subscribe). ...

  3. Qwt中鼠标获取坐标点

    void getPoint(QwtPlot *plot) { QPoint point = plot->canvas()->mapFromGlobal(QCursor::pos()); Q ...

  4. 将springboot项目发布到独立的tomcat中运行

    在开发阶段我们推荐使用内嵌的tomcat进行开发,因为这样会方便很多,但是到生成环境,我希望在独立的tomcat容器中运行,因为我们需要对tomcat做额外的优化,这时我们需要将工程打包成war包发进 ...

  5. ionic serve 第一次可以访问,刷新报错解决方法

    想学习一下,在ionic start 新项目后, ionic serve 第一次可以访问是可以的, 可是刷新一下后就报错了,端口也没给占用, 网上找了半天也没找到问题所在, 最后研究了下: npm i ...

  6. angular 当使用ng-repeat 时出现 $$hashKey的键值对

    小问题 把: ng-repeat="item in items " 改成 : ng-repeat="item in items track by $index"

  7. 【Python】简单实现爬取小说《天龙八部》,并在页面本地访问

    背景 很多人说学习爬虫是提升自己的一个非常好的方法,所以有了第一次使用爬虫,水平有限,依葫芦画瓢,主要作为学习的记录. 思路 使用python的requests模块获取页面信息 通过re模块(正则表达 ...

  8. 【Python】“UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9”根因及解决方法

    背景 自动化测试调用HTMLTestRunner生成测试报告的时候,出现了编码错误,错误如题 原因 搜索了很多资料,得出的结论是python的str默认是ascii编码,和unicode编码冲突,就会 ...

  9. bootstrap系统学习

    1.响应式中注意的内容: 一行(row)必须在.container中. col-xs- col-sm- col-md- col-lg- 列偏移 .col-md-offset-* 列排序 .col-md ...

  10. Django 2.0 的路由如何实现正则表达式

    在django2.0的路由系统中,摒弃了1.x中的url,而改用path.需要导入path. from django.urls import path,re_path 在1.x中,使用url()即可实 ...