Вам нужно то, что называется «селектором».
Я бы по-прежнему рекомендовал использовать синхронные вызовы - но в отдельном потоке. Причина этого заключается в том, что, несмотря на асинхронность, если вы передаете данные в текущем потоке, вы все равно будете испытывать проблемы с медлительностью пользовательского интерфейса. Если вы используете глобальный индикатор сетевой активности, это не проблема - но индикатор, локальный для вашего приложения (или любых других перерисовок экрана) - будет казаться заблокированным.
Поэтому создайте класс с именем ImageDownloader (или что-то подобное) и поместите туда свой синхронный вызов загрузки, чтобы получить данные изображения. Как один из членов вашего класса, объявите (в интерфейсе):
SEL successSelector;
Когда вы создаете этот класс (скажем, вы хотите передать URL-адрес и получить обратно данные изображения, создайте функцию инициализации следующей формы (которая принимает значение SEL) и вызовите ее, используя:
[ImageDownloader alloc] initWithSelector: @"http://url string" :self : @selector(yourFunction:)
]
По сути, вам нужно передать объект и метод в этом объекте для обратного вызова, когда все будет сделано.
Реализация initWithSelector выглядит следующим образом:
-(id) initWithSelector: (NSString*)url :(id)adelegate :(SEL) successSeletor {
self.url = url;
self.delegate = adelegate;
self.sel = successSelector;
}
(Обратите внимание на двоеточие после yourFunction - вам нужно двоеточие для каждого параметра, имеющегося в вашей функции обратного вызова.
Итак, сигнал для вашей функции выглядит так:
-(void) yourFunction: (NSData*)imageData;
Чтобы вызвать это из вашего класса ImageDownloader (когда загрузка будет завершена), просто вызовите ваш селектор, используя:
[delegate performSelector:sel withObject:imageData];
Наслаждайтесь!