Objective-C и NSURL: где я должен объявить полученные данные? - PullRequest
0 голосов
/ 13 июня 2010

У меня есть два класса, контроллер с именем «AppController» и класс с именем «URLDelegate», который инкапсулирует пример кода NSURL из Руководство по программированию системы загрузки URL-адресов Apple .

В руководстве неоднократно упоминается объявление переменной экземпляра receiveData "в другом месте". Я предполагаю, что это означает вне класса URLDelagate, потому что, если я объявлю это в классе URLDelegate, мой класс контроллера не сможет "увидеть" данные, которые были загружены.

Я знаю, что данные получены, потому что в моей функции connectionDidFinishLoading у меня NSLog отображает результаты:

NSLog(@"Succeeded! Received %d bytes of data",[receivedData length]);
receivedText=[[NSString alloc] initWithData:receivedData encoding: NSASCIIStringEncoding];
NSLog(@"receivedText=%@",receivedText);

Так что я немного озадачен следующими вопросами:

  1. Где я должен объявить полученные данные? Мой класс контроллеров? Третий класс?
  2. Могу ли я просто объявить это как любую обычную переменную NSMutableData?
  3. Как мне дать моему классу URLDelegate доступ к этой переменной? Например, если я объявлю receiveData в своем классе AppController, мне не придется создавать экземпляр AppController внутри URLDelegate? Но как это возможно, если именно класс AppController создает экземпляр класса URLDelegate?

Особенно в отношении последнего вопроса, я чувствую, что должен упускать из виду что-то ослепительно очевидное и фундаментальное. Если бы кто-нибудь мог указать мне правильное направление, я был бы очень признателен.

Спасибо!

Обновление: я переместил все функции NSURL из их класса URLDelegate и поместил их в мой класс контроллера. Теперь я могу обновить переменные в своем классе контроллера из connectionDidFinishLoading. Мне это кажется немного хакерским, но это работает.

1 Ответ

1 голос
/ 13 июня 2010

1.Где я должен объявить полученные данные?Мой класс контроллеров?Третий класс?

Он должен быть объявлен в том же классе, что и этот метод, чтобы этот метод мог его использовать.От вашего вопроса, похоже, что этот класс является вашим классом URLDelegate.Поскольку это явно объясняется в комментарии как «переменная экземпляра», «в другом месте» должен быть собственным заголовком этого класса в блоке переменных экземпляра класса.

2.Могу ли я просто объявить это как любую обычную переменную NSMutableData?

Да.См. соответствующую главу языка программирования Objective-C .

3.Как я могу дать своему классу URLDelegate «доступ» к этой переменной?

Классы не могут обращаться к переменным экземпляра в своих экземплярах, поскольку они являются переменными экземпляра;по определению, они являются частью и, следовательно, доступны только для экземпляров.

Экземпляры обращаются к своим переменным экземпляра так же, как к любой локальной или глобальной переменной, как показано в примере кода, на который вы ссылались:

receivedData = [[NSMutableData data] retain];

receivedData - переменная экземпляра, которую вы объявите в своем классе URLDelegate.Обратите внимание, что вы просто используете имя «receiveData» само по себе;вам не нужно использовать какой-либо специальный синтаксис для ссылки на переменную экземпляра, а не на другую переменную.По этой причине избегайте присвоения переменной экземпляра и локальной переменной одного и того же имени.

Существует несколько способов сделать данные доступными для контроллера приложения.Простым было бы выставить свойство URLDelegate, но это приводит к вопросу о том, как контроллер приложения должен знать, чтобы получить или повторно получить значение свойства.Более полный список решений приведен в главе «Общение с объектами» Руководства по основам какао .

...