simple and reliable Threading with NSOperation

本文探讨了iOS开发中的线程问题,包括并行计算和异步计算,并讨论了不适合使用线程的情况。文章进一步介绍了如何利用NSThread API和NSOperation解决线程问题,特别是NSOperation提供的线程隔离编程模式及其优势。

from:  https://developer.apple.com/library/ios/technotes/tn2109/_index.html

线程能解决两个方面的问题

1 并行计算

2 异步计算


但是如果是这两个方面的事,就不好用线程了

1周期性执行的任务   //

2网路工作               //最好实用原生的networking APIs


通常可以通过NSThread API 或 Cocoa的 performSelectorInBackground:withObject:

的方法来实现多线程,


section1 来展示thread problems


额外线程不能直接操作main thraed的UIKit


1用户添加一个项目 然后再threadA中长时间执行计算

2当A还没有执行完的时候,用户移除的item 然后B开始长时间的计算


那就拷贝一份array就能解诀这个问题


还有问题,

1 用户添加了一组item给list。然后A开始了新一轮的运算,A会花费很长的时间进行运算(运算时间的长度和数组的length成正比)

2 用户只留下一item,然后移除了其他的所有item。B开始运算了,然后消耗的时间非常短。

3 B结束后展示的是新的结果 

4 A然后会覆盖B的结果,展示的是旧的数据


还有两个更加严重的问题

1 取消  你取消A的同时,运行B。那么因为A的结果会是没有用的,所以我们最好取消A

2 存贮单元分配的 线程安全 view controller 的 -dealloc方法调用问题


section2 来展示NSOperation如何解决这些问题


NSOperation能够在thread ,asynchronously via run loop callbacks


NSOperation 使用thread confinement的编程模式,所有的资源被本线程所拥有,没有与其他线程分享。


使用NSOperation比较好的方法是:

1 用不变的data的copy来初始化operation

2 执行operation。执行的时候,只操作他初始化用的data和属于他的data,不与其他线程分享数据

3 operation结束的时候,其让数据对程序可用,同时自己不再接触这些数据。


Note:如果1不方便copy数据,那就只能你自己让这些数据只被它能够使用,不让其他thread operate它。3serial thread confinement


NSOperation有以下几个有用的资源:

1 每个operation都是通过operation queue(NSOperationQueue)来执行的.queue都有最大可并发执行的operation的数量(queue width)

2 通过operation queue来model problem space。

3 可以让operation 依赖其他  operation


section3 提供一下有效的tips和hints来提升效率



warning :在view controller中维持一个 operation queue是一很棘手的。但是在这个sample中,是没有关系的,因为ListAdderViewController是root view controller,它不会被deallocated.


NSOperation GCD 两者都相互补充

GCD是比较low-level API,可以给你更多灵活 NSOperation让你更加关注你的异步的代码

-------------------------------------------------------------------

Deallocation 问题

在UIKit object中,比如view controller中使用第二thread最大的问题是确保你的object deallocated safely.

以下情况会发生问题:

1

-performSelectorInBackground:withObject:

-performSelector:onThread:withObject:waitUnitDone:

-performSelector:onThread:withObject:waitUnitDone:modes:

2 当你用NSThread启动第二个thread

3 when you run a block asynchronously and block references self or an instance


当second thread 保留了一个target object,你要确保在main thread释放这个object的最后的引用之前 second thread就已经释放这个target的引用。如果你不能做到,那么target object的最后一个reference会被second thread所释放,就意味着,object的-dealloc方法会跑在second thread上。如果-dealloc方法在第二个线程上操作有危险的话,就会出现问题。比如view controller.


//example


//解决方法

1

2


NSOperation 支持两种operation

1 standard operations

需要NSOperation来为他们提供并发  NSOperationQueue要指定thread

exp:  long-running computations I/O (disk I/0)


2 concurrent operations

这些operation有他们自己的并发 NSOperationQueue不需要指定thread

exp: NSURLConnection API to do HTTP request

    


「LLM那些事」系列第 4 篇《上下文窗口的边界》,文章连接:https://blog.csdn.net/houwenjin/article/details/163999753。 演示什么:在「预测」Sheet 的黄色格子里输入一句话(默认「来泡一杯」),四个「模型」——分别只统计最后 1 / 2 / 3 / 4 个字的 n-gram 查表——同时预测下一个字。同一个输入,看的上下文越长,候选越少、预测越确定: ┌────────────────┬──────────┬───────────────┬──────┐ │ 只看最后几个字 │ 用的前缀 │ 候选下一字数 │ 预测 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 1 个 │ 杯 │ 3(茶/子/水) │ 模糊 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 2 个 │ 一杯 │ 2(茶/水) │ 收窄 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 3 个 │ 泡一杯 │ 1(茶) │ 确定 │ ├────────────────┼──────────┼───────────────┼──────┤ │ 4 个 │ 来泡一杯 │ 1(茶) │ 确定 │ └────────────────┴──────────┴───────────────┴──────┘
源码下载地址: https://pan.quark.cn/s/a4b39357ea24 笔记本的散热风扇管理 ---------------------------------------- 09 November 2006. 对于版本20061109的变更概述如下: 1) ACPI CA核心子系统:在源操作数是一个操作区域的场景下,对负载ASL操作符进行了优化。仅需映射操作区域内存,而不是执行逐字节读取。 (区域必须为SystemMemory类型,见下文。)修正了源操作数为区域字段的负载ASL操作符问题。也允许缓冲区对象作为源操作数。 BZ 480 解决了负载ASL操作符允许源操作数为任意类型操作区域的问题。现被限制为仅SystemMemory类型的区域,符合ACPI规范。 BZ 481 对新表管理器代码进行了额外的清理和优化。AcpiEnable将在所有必需的ACPI表未加载时失败(FADT, FACS, DSDT)。 BZ 477 在acobject.h中添加了#pragma pack(8/4),以确保此头文件中的结构始终编译为对齐。ACPI_OPERAND_OBJECT已被手动优化为对齐,并在字节打包时无法工作。示例代码和数据大小:这些是Microsoft Visual C++ 6.0 32位编译器生成的、与操作系统无关的acpica.lib的大小。调试版本的代码包含调试输出跟踪机制,具有更大的代码和数据大小。上一个版本:非调试版本:78.1K代码,17.1K数据,95.2K总计 调试版本:155.4K代码,63.1K数据,218.5K总计 当前版本:非调试版本:77.9K代码,17.0K数据,94.9K总计 调试版本:155.2K代码,63.1K数据,...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值