возвращение UIImage из блока - PullRequest
       3

возвращение UIImage из блока

0 голосов
/ 28 февраля 2012

У меня есть следующий код:

- (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 возвращается в блоке. Как мне избежать этого?

Ответы [ 3 ]

3 голосов
/ 28 февраля 2012

Вы не можете ничего вернуть из блока завершения, потому что он возвращается void.

Возможно, вам потребуется создать новый метод, например setLogo:(UIImage *)image, для объекта, который ожидает установки изображения, и вызвать этот метод из блока завершения.

0 голосов
/ 28 февраля 2012

Для получения объекта из ответа 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.

0 голосов
/ 28 февраля 2012

Вы можете поместить свой указатель img вне блока и объявить его __BLOCK и использовать его как замыкание. Но вам действительно нужно спросить себя, что вы планируете делать с img, учитывая, что вызов выполняется асинхронно. Я полагаю, вы должны сделать еще один вызов в блоке для другого метода и передать заполненное изображение в качестве параметра.

...