如何为我的块方法创建包装器 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?