Как создать новый файл, содержащий только его собственный делегат, чтобы я мог сделать ASIHTTPRequest с его собственным асинхронным окончанием и что-то достаточно простое, где мне просто нужно установить [request setDelegate:self];
на что-то вроде [request setDelegate:AlternateDelegate];
и просто добавить включить в начале документа для ссылки на делегата AlternateDelegateДругой делегат для ASIHTTPRequest Асинхронный?
ответ
Я знаю, этот вопрос старый, но в случае, если кто попадается ему:
@Hankweb seemes, чтобы говорить об использовании запроса в качестве своего собственного делегата. Есть ситуации, когда это работает. Например, я работаю над проектом, который использует 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's guide to blocks in Objective-C и ASIHTTPRequest block API documentation.
Делегат для ASIHTTPRequest является стандартным объектом объектива C. Просто создайте новый класс, включите его заголовок, создайте/получите объект и установите делегат в качестве этого объекта.
Вы пробовали это и столкнулись с проблемой? Если да, то в чем проблема?
Я действительно не понимаю, о чем вы спрашиваете, спрашиваете, как создать новый объект класса С? – JosephH
Просто пытаюсь создать другой делегат для файла. –