【发布时间】:2016-10-09 18:19:01
【问题描述】:
对象 X 需要下载图像。它具有图像的 URL(可能是网络文件)。我有一个通用的 imageHandler 类,它可以获取 URL 并获取 imageData。我想要这个方法,能够使用完成块来自定义如何处理下载的图像。
我熟悉如何使用委托模式。例如
@protocol ImageHandler: NSObject
-(void) getImageFromURL:(NSURL *)url forDelegate:(id <ImageRequestor>)delegate;
@end
@protocol ImageRequestor: NSObject
-(void) image:(UIImage *) image RetrievedForURL:(NSURL *)url withError:(NSError *)error;
@end
所以,基本上 objectX 类 getImageFromURL:delegate 方法,委托为 self。它符合 ImageRequestor 协议。
ImageHandler 对象,将 url 存储在哈希表中以委托映射。完成后,在委托上调用 image:RetrievedForURL:withError:。在这种方法中,我对图像和错误采取行动。
如何使用完成块实现相同的效果,其中我将“我想对检索到的图像做什么”作为一段代码传递。
我看到的一种方法如下。但看起来它需要 ImageHandler 方法实现调用带有特定参数的完成。这是实现这一点的公认方式(即完成处理程序依赖于接收它的方法以使用正确的参数调用它)?
@protocol ImageHandler: NSObject
-(void) getImageFromURL:(NSURL *)url withCompletionHandler:(void (^)(UIImage *image, NSError * err))completionBlock;
@end
getImageFromURL:(NSURL *)url withCompletionHandler:(void (^)(UIImage *image, NSError * err))completionBlock 的实现看起来像
getImageFromURL:(NSURL *)url withCompletionHandler:(void (^)(UIImage *image, NSError * err))completionBlock
{
//Get UIImage from URL, store it UIIMage ObjectX
//if error happens, store it in NSError objectY, else it is nil
//call completion handler
completionBlock(<UIIMage objectX>,<NSError objectY>);
}
【问题讨论】:
标签: ios objective-c delegates objective-c-blocks completionhandler