returning UIImage from block

2019-01-09 19:44发布

问题:

I have the following code:

- (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];
    }
}

The issue is that the return value/UIImage is returned at a block. How do I avoid this?

回答1:

You're unable to return anything from the completion block because it's returned void.

You'll probably need to create a new method like setLogo:(UIImage *)image on the object that's expecting the image to be set, and call that method from within the completion block.



回答2:

You can place your img pointer outside the block and declare it __BLOCK and use it as a closure. But you really need to be asking yourself what do you plan to do with img, bearing in mind the call is made asynchronously. I would imagine you should make another call in the block to another method and pass in the populated image as a parameter.



回答3:

For getting an object from the ASIHttpRequest response, I use notifications.

For example, in the calling 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 {
    ...
}

in your completion block

 [[NSNotificationCenter defaultCenter] postNotificationName:@"getPhotoNotification" object:self userInfo:userInfo];

With your photo in userInfo.