Передача объекта в блок ASIHTTPRequest - PullRequest
1 голос
/ 31 января 2012

OK. Мне не совсем понятны блоки, но я часто их использую; особенно при выполнении ASIHTTPRequest. Я хотел бы передать объект в блок и сделать запрос назначить значение для объекта по завершении, но я не знаю, как сделать объект «доступным» внутри блока.

Вот мой метод ...

- (void)fetchImageAsynchronously:(NSURL *)theURL intoImageObject:(UIImage *)anImageObject
{
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:theURL];
    [request setDownloadCache:[ASIDownloadCache sharedCache]];
    [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
    [request setCompletionBlock:^{
        NSData *responseData = [request responseData];
        anImageObject = [UIImage imageWithData:responseData];
    }];
    [request setFailedBlock:^{
        // NSError *error = [request error];
    }];
    [request startAsynchronous];
}

Итак, когда запрос завершится, я хочу, чтобы значением anImageObject было извлеченное изображение. Но anImageObject недоступен внутри блока.

Кто-нибудь любезно поможет?

1 Ответ

1 голос
/ 31 января 2012

anImageObject должен быть передан по ссылке. То есть UIImage ** и передают адрес anImageObject при вызове метода.

Это не очень хороший дизайн, потому что вам также придется управлять временем жизни anImageObject и, скорее всего, публиковать какие-то уведомления о его готовности. То есть этот код сломается, если anImageObject будет освобожден во время загрузки данных изображения. И вы не будете знать, что anImageObject был инициализирован с данными или нет.

- (void)fetchImageAsynchronously:(NSURL *)theURL intoImageObject:(UIImage **)anImageObject
{
    __block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:theURL];
    [request setDownloadCache:[ASIDownloadCache sharedCache]];
    [request setCacheStoragePolicy:ASICachePermanentlyCacheStoragePolicy];
    [request setCompletionBlock:^{
        NSData *responseData = [request responseData];
        *anImageObject = [UIImage imageWithData:responseData];
    }];
    [request setFailedBlock:^{
        // NSError *error = [request error];
    }];
    [request startAsynchronous];
}
...