returning UIImage from block

岁酱吖の 提交于 2019-11-26 14:56:45

问题


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.



来源:https://stackoverflow.com/questions/9474018/returning-uiimage-from-block

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!