Используя пользовательский подкласс NSURLConnection, как он «находит» дополнительные данные в классе позже? - PullRequest
6 голосов
/ 30 ноября 2011

Этот блог предлагает хорошее решение для обработки нескольких NSURLConnections: создайте пользовательский класс "CustomURLConnection", который имеет дополнительное свойство tag.

http://blog.emmerinc.be/index.php/2009/03/02/custom-nsurlconnection-class-with-tag/

http://blog.emmerinc.be/index.php/2009/03/15/multiple-async-nsurlconnections-example/

По сути, он просто добавил свойство tag к существующему NSURLConnection:

CustomURLConnection.m

- (id)initWithRequest:(NSURLRequest *)request delegate:(id)delegate startImmediately:(BOOL)startImmediately tag:(NSString*)tag {
   self = [super initWithRequest:request delegate:delegate startImmediately:startImmediately];

   if (self) {
      self.tag = tag;
   }
   return self;
}

затем, позже в обычных методах загрузки NSURLConnection, вы можете сделать:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

   //Log the connection’s tag
   CustomURLConnection *ttttag = (CustomURLConnection *)connection; // **HERE**
   NSLog(@”%@”, ttttag.tag);


   NSMutableData *dataForConnection = [self dataForConnection:(CustomURLConnection*)connection];
   [connection release];
}

Итак, вот где у меня проблемы.Как я понимаю, вот как это происходит:

  • Я создаю «соединение + тег»
  • Первый фрагмент кода, который я разместил выше, создает обычное «соединение» (нетtag), которая в конечном итоге вызовет обычные методы NSURLConnection, такие как connectionDidFinishLoading.Что происходит с tag в этот момент?
  • В методе connectionDidFinishLoading я могу преобразовать соединение обратно в «connection + tag», а затем найти информацию об отсутствующем теге, который был отброшен,Как?

Может быть, я просто запутываю себя, но кажется, что tag был отброшен, когда он начинается по обычному пути NSURLConnection.Но затем, преобразовав его в подкласс, я снова могу восстановить свойство tag.Где он жил / уехал в это время?

Может ли кто-нибудь с лучшим пониманием наследования объяснить мне это?

Ответы [ 2 ]

4 голосов
/ 01 декабря 2011

С этим кодом:

[[CustomURLConnection alloc] initWithRequest:... delegate:... startImmediately:... startImmediately tag:...];

вы создаете экземпляр CustomURLConnection.Теперь здесь ваше понимание неверно: этот CustomURLConnection объект может свободно вызывать все методы своих суперклассов, но он всегда останется CustomURLConnection.tag всегда там.

Методы, которые определены в суперклассе, такие как initWithRequest:delegate:startImmediately:, не знают о теге, но и не обязаны.Когда вызывается метод делегата:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection

, аргумент connection - это очень похожий CustomURLConnection, который вы создали выше.Тип в сигнатуре метода отличается, но это не имеет значения;поскольку вы знаете, что это соединение имеет тип CustomURLConnection, вы можете просто привести объект connection к правильному типу и получить доступ к новому свойству.Но даже если вы этого не сделаете, tag все равно будет там все время.

1 голос
/ 01 декабря 2011

Я не уверен, что вы подразумеваете под:

Первый фрагмент кода, который я разместил выше, создает обычное «соединение» (без тега).

Что вы сделали здесь, так это создали подкласс NSURLConnection. Везде, где вы можете использовать последнее, вы можете использовать первое. NSURLConnection* означает «указатель на NSURLConnection* или его подкласс». Таким образом, исходный объект, который вы создали, был CustomURLConnection и включал дополнительный ивар. Этот ивар не исчезает только потому, что пользователи-посредники называют его своим суперклассом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...