2012-01-31 3 views
1

OK. Я не совсем понимаю, что такое блоки, но я часто их использую; особенно при выполнении ASIHTTPRequest. Я хотел бы передать объект в блок и запросить присвоение значения объекту при его завершении, но я не знаю, как сделать объект «доступным» внутри блока.Передача объекта в блок 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

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

Это не большой дизайн, потому что вам также придется управлять временем жизни объекта aImageObject, а также, вероятно, опубликовать какое-то уведомление о его готовности. То есть, этот код будет разорваться, если 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]; 
} 
Смежные вопросы