NSThread提取并处理队列

问题描述

| 我有一个应用程序需要每X毫秒(而不是更快!)发送收集的数据。我的第一个想法是将数据堆积在
thread1
NSMutableArray
array1
)上。当“ 3”完成等待X毫秒后,它将用一个新的(“ 4”)交换NSMutableArray,然后处理其内容。但是,我不希望
thread1
一旦拥有
thread2
便进一步修改
array1
。 这可能会起作用,但是线程安全性不是您想要“只是尝试一下”的领域。这种方法的陷阱是什么,我应该怎么做? (此外,如果ѭ3实际上是一个NSTimer实例,问题/答案如何变化?是否都在一个线程上发生[对我来说这很好,因为处理只需要一毫秒的时间])。     

解决方法

您应该使用NSOperationQueue或Grand Central Dispatch。基本上,您将创建一个接收数据并在X毫秒过去后上传数据的操作。每个操作都是独立的,您可以为队列配置允许的并发操作数,操作优先级等。 Apple关于并发的文档应该可以帮助您: http://developer.apple.com/library/ios/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/Introduction/Introduction.html     ,当您“换掉” 9英镑换一个新的时,这种方法的陷阱就产生了。想象一下,线程1获得了对数组的引用,同时线程2交换了数组并完成了处理。 Thread1现在正在写入一个失效的数组(将不再处理该数组),即使只是几毫秒。防止这种情况的方法是在关键部分中使用同步代码块(即,使代码具有“线程安全性”),但是很难避免过度标记和同步您的代码过多(牺牲了性能)。 因此,风险是: 编写不是线程安全的代码 使过度使用的代码同步且速度慢(线程已经具有性能开销) 结合这两种方式:慢速,不安全的代码。 这个想法是“从线程迁移”,这就是链接的含义。