Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSO操作+;客观C类=坏主意?_Iphone_Objective C_Image_Uiimageview_Nsoperation - Fatal编程技术网

Iphone NSO操作+;客观C类=坏主意?

Iphone NSO操作+;客观C类=坏主意?,iphone,objective-c,image,uiimageview,nsoperation,Iphone,Objective C,Image,Uiimageview,Nsoperation,我已经为iPhone应用程序的UIImageView类设置了Objective-C类别。该类别的任务是帮助使用内存/磁盘缓存异步加载基于URL的图像 现在,在UIImageView+Cache.m中,我可以访问一个NSOperationQueue,以便启动一个加载线程。我创建一个NSOperation派生对象,用图像URL和目标UIImageView初始化,并创建一个选择器,在操作完成后在目标上执行。在选择器方法中,我们设置了新加载的图像(或者,如果找不到,我们设置了一个备用占位符图像),就完成

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

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

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

因此,如果你决定在所有图像加载之前开始点击-卡布拉姆!不愉快的线程有一个无效的对象,并且不知道它:(

我能找到的最有助于缓解这一问题的方法是NSOperation的cancelisCancelled方法,除非您无法跟踪类别中要取消的操作对象,因为如果我理解正确,类别无法向对象添加IVAR

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


感谢您的建议!

我想说,将其移动到您自己的UIImageView子类中没有坏处。当然,您可能喜欢类别-但如果它们不起作用,那么为什么还要犹豫是否要移动到这样的设计中呢?

我想说,将其移动到您自己的UIImageView子类中没有坏处。当然,您可能喜欢类别-但如果他们做不到这一点,那么为什么要犹豫是否要采用这样的设计呢?

在这种情况下,我可能不会使用类别。类别是有用的,但通常是不必要的。只有当你有充分的理由这样做时,我才会使用类别。你到底在类别中放了什么


我认为您可以在NSOperation子类中实现整个操作,这将是最好的解决方案。在图像视图上添加一个retain,这样在图像下载之前它就不会被释放,如果视图不再可见,则取消下载。如果不可能,则使用UIImageView子类,而不是使用类别。

I在这种情况下,我可能不会使用类别。类别很有用,但通常是不必要的。只有在你有充分理由这样做的情况下,我才会使用类别。你到底在类别中放了什么


我认为您可以在NSOperation子类中实现整个操作,这将是最好的解决方案。在图像视图上添加一个retain,这样它就不会在图像下载之前被释放,如果视图不再可见,则取消下载。如果不可能,则使用UIImageView子类,而不是使用类别。

a您是否通过NSOperation保留UIImageView?否则,可能会在NSOperation完成之前释放imageView,从而导致kablooi central。您应该执行保留操作,然后在完成setImage后执行释放操作。

您是否通过NSOperation保留UIImageView?否则,可能会在NSOpera之前释放imageViewtion完成,通向kablooi central。你应该先做一个retain,然后在完成setImage后再做一个release。

我并不是说我会犹豫。我只是想知道从总体上看,从设计模式的角度来看,这是否是一个好主意。关于使用子类,我刚刚发现了一个例子!还没有尝试过,但想尝试一下适合在家里玩的人:我并不想暗示我会犹豫。我只是想知道这在总体上是否是一个好主意,从设计模式的角度来看。就您关于使用子类的观点而言,这里有一个我刚刚发现的示例!我还没有尝试过,但想与在家玩的人分享:该类别为UIImageView添加了两种方法:lloadWithCachedImageForURL:(NSURL*)url和didFinishLoadingImageWithResult:(NSDictionary*)结果。还有一个名为ImageLoadingOperation的NSOperation子类,在启动op时由loadWithCachedImageForURL使用。(队列在用于少数常见对象的singleton类的其他地方定义。)同时,保留的想法听起来可能有用!我没有想到这个。我会报告-谢谢!使用“保留帮助”!谢谢!好吧,保留/释放。;)至于检查可见性,操作不知道目标是什么(UIImageView,等等)。现在,我想我可以检查它是什么类型的对象,但是这个操作最初设计用于处理任何对象,而不仅仅是图像视图。目前,我将继续加载映像,并在init中执行retain,在dealloc中执行release(用于NSOperation)。有道理吗?听起来不错。唯一的缺点是,您可能正在下载永远不会显示的图像。如果用户浏览了很多内容,这可能会成为一个问题。也许你可以基于一个可选的方法来取消,比如:if([targetObject respondsToSelector:@selector(hasBeenInvalidated)]{if([targetObject hasBeenInvalidated]){[self cancel];}}}回到你答案的第一部分,我仍然在使用一个类别,而这个类别又在幕后使用一个NSOperation。其想法是赋予UIImageView一个额外的方法,异步加载/缓存图像,因此NSOperation在一个地方使用,而不是在我拥有UIImageView的任何地方使用。也许这仍然是不明智的?如果是这样的话,我该如何在仅使用NSOperation的情况下干净地做到这一点,同时在其他地方保持所有UIImageView实例的整洁?该类别向UIImageView添加了两个方法:loadW