gpt4 book ai didi

ios - 如何为我的 block 方法创建包装器类,以便我可以单行使用它

转载 作者:搜寻专家 更新时间:2023-10-30 20:24:14 24 4
gpt4 key购买 nike

我创建了一个小的解决方案,用于下载任何类型的文件,然后将其保存到 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com