我有以下代码:
- (UIImage *) getPublisherLogo
{
//check the cache if the logo already exists
NSString * imageUrl = [NSString stringWithFormat:@"%@/%@&image_type=icon", self.baseUrl, self.imageUrl_];
ASIHTTPRequest * imageRequest = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:imageUrl]];
[imageRequest setTimeOutSeconds:30.0];
[imageRequest setDownloadCache:[ASIDownloadCache sharedCache]];
[imageRequest setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
[imageRequest setCachePolicy:ASIAskServerIfModifiedWhenStaleCachePolicy|ASIFallbackToCacheIfLoadFailsCachePolicy];
[imageRequest setCompletionBlock:^(void){
UIImage *img = [UIImage imageWithData:[imageRequest responseData] ];
if (img){
return img;
}
}];
[imageRequest setFailedBlock:^(void){
NSLog(@"Error in pulling image for publisher %@", [[imageRequest error] userInfo]);
}];
[imageRequest startAsynchronous];
}
}
问题是在块中返回返回值/ UIImage。我该如何避免这种情况?
答案 0 :(得分:3)
您无法从完成块返回任何内容,因为它已返回void
。
您可能需要在期望设置图像的对象上创建一个新方法,如setLogo:(UIImage *)image
,并在完成块中调用该方法。
答案 1 :(得分:0)
您可以将img指针放在块之外并将其声明为__BLOCK并将其用作闭包。但是你真的需要问自己,你打算用img做什么,记住这个调用是异步的。我想你应该在块中再次调用另一个方法并将填充的图像作为参数传递。
答案 2 :(得分:0)
为了从ASIHttpRequest响应中获取对象,我使用通知。
例如,在调用viewController
中- (void)viewDidLoad {
// Subscribe notifications
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onGetPhoto:) name:@"getPhotoNotification" object:nil];
}
- (void)viewDidUnload {
[super viewDidUnload];
// Unsubscribe from notifications
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"getPhotoNotification" object:nil];
}
- (void)onGetPhoto:(NSNotification *)notification {
...
}
在您的完成区块中
[[NSNotificationCenter defaultCenter] postNotificationName:@"getPhotoNotification" object:self userInfo:userInfo];
将您的照片放在userInfo中。