1

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

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

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

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

我能找到的最有助于缓解这种情况的方法是 NSOperation 的cancelisCancelled方法,但您无法跟踪类别中要取消的操作对象,因为 - 如果我理解正确 - 类别无法将 IVAR 添加到对象!

也许这意味着类别在这里不是一个好主意?(呜咽:“但我喜欢分类!哇!”

建议赞赏!

4

3 回答 3

1

对于这种情况,我可能不会使用类别。类别很有用,但通常是不必要的。如果您有充分的理由,我只会使用类别。你到底把什么放在这个类别中?

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

于 2009-07-09T12:35:56.053 回答
0

我想说将它移到您自己的 UIImageView 子类中没有害处。当然,您可能喜欢类别——但如果它们不能胜任这项工作,那么为什么还要犹豫转向能够胜任的设计呢?

于 2009-07-09T12:31:35.193 回答
0

您是否保留了 NSOperation 的 UIImageView?否则,可能会在 NSOperation 完成之前释放 imageView,从而导致 kablooi central。你应该做一个保留,然后,一旦你完成了 setImage,做一个释放。

于 2009-07-23T08:31:32.490 回答