从块返回UIImage

我有以下代码:

- (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是在一个块返回。 我如何避免这种情况?

你无法从完成块返回任何东西,因为它被返回void

您可能需要在期望要设置setLogo:(UIImage *)image的对象上创build一个新的方法,如setLogo:(UIImage *)image ,并从完成块内调用该方法。

你可以把你的img指针放在块之外,并声明它__BLOCK并用它作为闭包。 但是你真的需要问自己,你打算怎么处理img,要记住这个调用是asynchronous的。 我会想象你应该在另一个方法中调用另一个方法,并通过填充图像作为参数。

为了从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。