2010-08-19 1 views
0

Как создать новый файл, содержащий только его собственный делегат, чтобы я мог сделать ASIHTTPRequest с его собственным асинхронным окончанием и что-то достаточно простое, где мне просто нужно установить [request setDelegate:self]; на что-то вроде [request setDelegate:AlternateDelegate]; и просто добавить включить в начале документа для ссылки на делегата AlternateDelegateДругой делегат для ASIHTTPRequest Асинхронный?

+0

Я действительно не понимаю, о чем вы спрашиваете, спрашиваете, как создать новый объект класса С? – JosephH

+0

Просто пытаюсь создать другой делегат для файла. –

ответ

1

Я знаю, этот вопрос старый, но в случае, если кто попадается ему:

@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.

1

Делегат для ASIHTTPRequest является стандартным объектом объектива C. Просто создайте новый класс, включите его заголовок, создайте/получите объект и установите делегат в качестве этого объекта.

Вы пробовали это и столкнулись с проблемой? Если да, то в чем проблема?