【发布时间】:2012-07-15 22:10:03
【问题描述】:
我正在开发一款 iPad 应用,目前正在努力寻找最佳的多线程方法。让我用一个简化的例子来说明这一点:
我有一个包含 2 个子视图的视图、一个目录选择器和一个画廊,其中包含所选目录中所有图像的缩略图。由于“下载”和生成这些缩略图可能需要很长时间,所以我需要多线程,这样视图的交互和更新就不会被阻塞。
这是我已经尝试过的:
[self performSelectorInBackground:@selector(displayThumbnails:) withObject:currentFolder];
这很好用,因为用户交互没有被阻止,但是当用户在第一个文件夹仍在加载时点击另一个文件夹时,它会惨遭失败。两个线程试图访问相同的视图和变量,这会导致彼此之间的正确执行混乱。当用户点击另一个文件夹时,当前加载文件夹的displayThumbnails 应该被中止。我没有找到任何方法来做到这一点..
NSThreads
我尝试了这个,但遇到了与第一种方法几乎相同的问题,我没有找到一种(简单的)方法来取消正在进行的方法。 (是的,我知道[aThread cancel],但没有找到“恢复”线程的方法)。也许我应该继承NSThread 并实现我自己的 isRunning 等方法?但是有没有更好的方法或我忽略的第三个(甚至第四个和第五个)选项?
我认为这是一个相当简单的示例,并且我认为在不继承 NSThread 的情况下可能有更好的解决方案。那么,你会怎么做?请发表您的意见!
【问题讨论】:
-
显然我无法做出只显示“GCD”的答案
-
你完全错了。说真的。
-
查看here 为什么 GCD 如此酷 :) 或者更好的是,观看其中一个 WWDC 会议 :) 关于您的原始问题:有多种取消或暂停方式,无论您是否重新使用线程、GCD 或 NSOperationQueue。您可以休眠、挂起、等待锁定、完全取消等。我认为 NSOperationQueue 现在对您来说是一个很好的解决方案,因为它会自动引导您进行合理的实现..
-
Apple 的 Threading Programming Guide 在其首页将您定向到 Concurrency Programming Guide,这正是您想要的。
-
.. 但也一定要研究其他技术! WWDC 会议视频或Concurrency Guide on Apple's Developer Website 是很好的起点。
标签: objective-c ios multithreading cocoa nsthread