s1m*_*m0n 6 cocoa multithreading objective-c nsthread ios
我正在开发一个iPad应用程序,我目前正在努力寻找多线程的最佳方法.让我用一个简单的例子来说明这一点:
我有一个包含2个子视图的视图,一个目录选择器和一个图库,其中包含所选目录中所有图像的缩略图.由于"下载"并生成这些缩略图可能需要很长时间才需要多线程,因此视图的交互和更新不会被阻止.
这就是我已经尝试过的:
[self performSelectorInBackground:@selector(displayThumbnails :) withObject:currentFolder];
这工作正常,因为用户交互没有被阻止,但是当用户在第一个文件夹仍在加载时点击另一个文件夹时,它很可能失败.两个线程试图访问相同的视图和变量,这导致彼此搞乱正确执行.当用户点击另一个文件夹时,displayThumbnails当前加载的文件夹应该被中止.我没有找到任何办法这样做..
NSThreads
我试过这个但是遇到了与第一种方法几乎相同的问题,我没有找到一种(简单的)方法来取消正在进行的方法.(是的,我知道[aThread cancel]但没有办法'恢复'线程).也许我应该NSThread继承并实现我自己的isRunning等方法?但是,有没有更好的方法或第三(甚至第四和第五)选项我忽略?
我认为这是一个相当简单的例子,我认为没有子类化可能有更好的解决方案NSThread.那么,你会做什么?请你的意见!
NSOperationQueue应该可以很好地完成这项任务.
另一个选择是普通的GCD,但是,如果你从未使用它,NSOperationQueue可能是更好的选择,因为它几乎自动引导你以"正确的方式"实现"有明显的取消方式"等.
您希望使用Concurrent NSOperations在后台下载和处理图像.这些将由NSOperationsQueue管理.基本上,这些操作将被配置为每个操作获取一个图像,处理它,将其保存在文件系统中,然后在主线程中将图像发送回主应用程序.
github上有几个项目你可以看看如何做到这一点 - 只需使用"Concurrent"或"NSOperation"搜索github.
iOS有一个很好的后台工作设施.Grand Central Dispatch(GCD)和Blocks,但那些不会让你有一个使用委托回调的对象 - 因此NSOperation.
因此,您需要阅读块,GCD,然后查看一些开源的Concurrent NSOperations代码.使用并发NSOperations并不像使用块那么简单.
| 归档时间: |
|
| 查看次数: |
3998 次 |
| 最近记录: |