Я знаю, что этот вопрос старый, но в случае, если кто-нибудь сталкивается с ним:
@ Hankweb, похоже, говорит об использовании запроса в качестве своего собственного делегата.Конечно, есть ситуации, когда это работает.Например, я работаю над проектом, который использует ASIHTTPRequest
для извлечения JSON из удаленного источника и импорта его в хранилище базовых данных.
Эта операция (буквально, поскольку ASIHTTPRequest
является подклассомNSOperation
) почти полностью автономен;У меня есть пользовательский запрос в фоновом потоке, использующий потоковый анализатор JSON для импорта объектов в NSManagedObjectContext
, который при сохранении вызывает уведомление, которое я перехватываю внутри и передаю в контекст основного потока, используя performSelectorOnMainThread:waitUntilDone:
.
Я использую поддержку блока ASIHTTPRequest
для достижения этой цели;в моем пользовательском методе initWithURL:
я установил соответствующие обратные вызовы (dataReceivedBlock
, completionBlock
, failureBlock
и т. д.).Традиционный шаблон делегирования (с использованием протокола ASIHTTPRequestDelegate
) также должен работать.
Один прием: вы должны убедиться, что запрос не будет сохраняться слишком много раз, иначе вы в конечном итоге получитеутечка памяти.Это может быть легко пропустить при использовании нескольких потоков, особенно при использовании блоков.Вместо:
- (id)initWithURL:(NSURL *aURL) {
//...
[self setCompletionBlock:^{
[self doSomething];
}];
//...
return self;
}
Используйте атрибут __weak
(или __block
, если вы не используете ARC) при ссылке на self
внутри блоков:
- (id)initWithURL:(NSURL *aURL) {
//...
__weak id blockSelf = self;
[self setCompletionBlock:^{
[blockSelf doSomething];
}];
//...
return self;
}
Если вы не знаете, почему это важно, обязательно прочитайте руководство Apple по блокам в Objective-C и документацию API блока ASIHTTPRequest .