NSOperation + Objective-C类别=糟糕的想法?

时间:2009-07-09 12:25:16

标签: iphone objective-c image uiimageview nsoperation

我为iPhone应用程序的 UIImageView 类设置了Objective-C类别。该类别的任务是帮助加载与内存/磁盘缓存异步的基于URL的图像。

现在,在UIImageView + Cache.m中,我可以访问 NSOperationQueue ,因此我可以启动加载线程。我创建了一个 NSOperation 派生的对象,用图像URL和目标UIImageView初始化,以及一个操作完成后在目标上执行的选择器。在选择器方法中,我们设置新加载的图像(或者,如果没有找到,我们设置一个替代的占位符图像),我们就完成了!

这样可以正常工作,直到在NSOperation完成之前,正好删除了UIImageView。例如,我的UI中有一个上一个/下一个分段控件,导致这些UIImageViews被删除并重新添加(它们是应用程序中正在查看的较大“项目”的一部分),因此很容易点击这些都是快速连续的。

因此,如果您决定在加载所有图像之前开始使用 - KABLAM!不开心的线程有一个无效的对象,并不知​​道它。 :(

我能找到最接近帮助缓解此问题的是NSOperation的取消 isCancelled 方法,但您无法跟踪要在类别中取消的操作对象,因为 - 如果我理解正确 - 类别不能将IVAR添加到对象!

也许这意味着类别在这里不是一个好主意? (呜呜声:“但我是liiiiike类别!Waaah!”

建议表示赞赏!

3 个答案:

答案 0 :(得分:1)

我可能不会在这种情况下使用类别。类别很有用,但通常是不必要的。如果你有充分的理由,我只会使用一个类别。你究竟在这个类别中投入了什么?

我认为你可以在NSOperation子类中实现整个过程,这将是最好的解决方案。在图像视图上放置一个保留,以便在下载图像之前不会取消分配,如果视图不再可见,则取消下载。如果那是不可能的,那么继承子类UIImageView而不是使用类别。

答案 1 :(得分:0)

我想说将它移动到你自己的UIImageView子类中是没有害处的。当然,你可能喜欢类别 - 但是如果他们不做这个工作,那么为什么不愿意转向设计呢?

答案 2 :(得分:0)

你是否通过NSOperation保留了UIImageView?否则,在NSOperation完成之前可能会释放imageView,从而导致kablooi中心。你应该做一个保留,然后,一旦你完成了setImage,就做一个发布。