作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我创建了一个小的解决方案,用于下载任何类型的文件,然后将其保存到 Cache.db。到目前为止一切正常,但现在我想为这个类创建一个包装类,这样我就可以将 Nsdata 转换为我想要的任何格式
#import "DownLoadFiles.h"
@implementation DownLoadFiles
@synthesize task,session,dataType;
-(void)DownloadCacheFile:(NSURLRequest*)urlRequest callBackBlock:(void (^)(id))responeBlock{
NSURLSession *sessions = [NSURLSession sharedSession];
NSCachedURLResponse *cachedResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:urlRequest];
if ([cachedResponse isKindOfClass:[NSNull class]]||cachedResponse==nil) {
NSLog(@"cachedResponse -- %@",[cachedResponse response]);
NSURLSessionDataTask *tasked= [sessions dataTaskWithRequest:urlRequest
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
responeBlock(data);
}];
[tasked resume];
}else{
switch (urlRequest.cachePolicy) {
case NSURLRequestUseProtocolCachePolicy:
case NSURLRequestReturnCacheDataElseLoad:
case NSURLRequestReturnCacheDataDontLoad: {
responeBlock([cachedResponse data]);
break;
}
default:
break;
}
}
}
@end
例如,我知道 url 包含图像,所以我想将 NSData 转换为 UIImage,与其他格式类型(如 json、avi 等)相同。像这样。
@implementation AKImage
@synthesize image;
-(UIImage*)SetImageforUrl:(NSURLRequest*)imgRequest {
UIImage *image;
DownLoadFiles*dwnl=[[DownLoadFiles alloc] init];
[dwnl DownloadCacheFile:req
callBackBlock:^(id response) {
image= [UIImage imageWithData:response];
}];
return image;
}
@end
所以问题从这里开始。我想返回图像,但图像不会等待惰性方法返回数据,所以它返回 nil 并且在一段时间后 block 有数据。
在我的 viewController 中,我想像这样使用 AKImage 包装器类
AKImage *akObj=[[AKImage alloc] init];
self.imgView.image=[akObjt SetImageforUrl:req];
但目前这个区 block 不允许我这样做
最佳答案
您需要向您的方法添加自定义回调,以便在调用下载回调时调用它。
-(void)imageforUrl:(NSURLRequest*)imgRequest completion:(void (^)(UIImage *image))handler {
DownLoadFiles *dwnl = [[DownLoadFiles alloc] init];
[dwnl DownloadCacheFile:req callBackBlock:^(id response) {
// Update UI on the main queue
dispatch_async(dispatch_get_main_queue(), ^{
handler([UIImage imageWithData:response]);
});
}];
}
然后这样调用它:
AKImage *akObj = [[AKImage alloc] init];
[akObjt imageforUrl: req completion:^(UIImage *image) {
self.imgView.image = image
}];
自从我写了一些 Objective-C 以来已经有一段时间了,请自己仔细检查语法。
编辑:
创建类方法:What is the difference between class and instance methods?
关于ios - 如何为我的 block 方法创建包装器类,以便我可以单行使用它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40708224/
我刚开始使用 Dagger 2,想知道与我目前用来实现依赖注入(inject)的技术相比,它有什么优势。 目前,为了实现 DI,我创建了一个具有两种风格的项目:mock 和 prod。在这些风格中,我
我是一名优秀的程序员,十分优秀!