如何为我的块方法创建包装器 class 以便我可以单行使用它
How to Create Wrapper class for my block method so i can use it by single line
我创建了一个用于下载任何类型文件的小解决方案,然后将其保存到 Cache.db。到目前为止一切正常,但现在我想为此 class 创建一个包装器 Class 以便我可以将 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
所以问题从这里开始。我想 return 图像,但图像不会等待惰性方法 return 数据,所以它是 returning nil 并且在某个时间块后有数据。
在我的 viewController 我想像这样使用 AKImage 包装器 Class
AKImage *akObj=[[AKImage alloc] init];
self.imgView.image=[akObjt SetImageforUrl:req];
但目前这个区块不允许我这样做
您需要向您的方法添加自定义回调,以便在调用下载回调时调用它。
-(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,请自己仔细检查一下语法。
编辑:
制作class方法:What is the difference between class and instance methods?
我创建了一个用于下载任何类型文件的小解决方案,然后将其保存到 Cache.db。到目前为止一切正常,但现在我想为此 class 创建一个包装器 Class 以便我可以将 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
所以问题从这里开始。我想 return 图像,但图像不会等待惰性方法 return 数据,所以它是 returning nil 并且在某个时间块后有数据。
在我的 viewController 我想像这样使用 AKImage 包装器 Class
AKImage *akObj=[[AKImage alloc] init];
self.imgView.image=[akObjt SetImageforUrl:req];
但目前这个区块不允许我这样做
您需要向您的方法添加自定义回调,以便在调用下载回调时调用它。
-(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,请自己仔细检查一下语法。
编辑:
制作class方法:What is the difference between class and instance methods?