Другой делегат для ASIHTTPRequest Асинхронный? - PullRequest
0 голосов
/ 19 августа 2010

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

Ответы [ 2 ]

1 голос
/ 15 марта 2011

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

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

1 голос
/ 20 августа 2010

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

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

...