Правильная обработка асинхронного NSObject

У меня ситуация похожа на эту: C: Как правильно использовать управление памятью для асинхронных методов

У меня есть объект, который асинхронно загружает и анализирует XML-документ. Затем у него есть метод делегата, который передает полученные данные вызывающей стороне.

Мои 2 вопроса:

Когда я выпущу объект для извлечения данных? Ссылка, которую я разместил выше, дает 2 ответа: один говорит о выпуске в делегате, а другой говорит о немедленном освобождении, что правильно (или что лучше, если оба ответа верны)

Мой второй вопрос: как лучше всего передать полученные данные вызывающему абоненту? На данный момент у меня есть

self.imagesDataSource = [articleImagesParserObject.returnedArray copy];

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


person Spider-Paddy    schedule 08.07.2010    source источник
comment
Я, вероятно, должен добавить, что я не ищу кого-то, кто сделает за меня домашнюю работу, я пытаюсь учиться, пожалуйста, объясните, почему что-то не так и почему вы должны делать что-то определенным образом.   -  person Spider-Paddy    schedule 08.07.2010


Ответы (1)


Я собираюсь забрать вас на пару вещей .. Это может начаться дело :)

Ты говоришь

Затем у него есть метод делегата, который передает полученные данные вызывающей стороне.

-- РЕДАКТИРОВАТЬ --
Вы имеете в виду, что отправляете сообщение делегату NSURLConnection. Да, это просто семантика, но так понятнее.

Ты говоришь

Ссылка, которую я разместил выше, дает 2 ответа: один говорит о выпуске в делегате, а другой говорит о немедленном освобождении.

Сообщение, на которое вы ссылаетесь, говорит, что если вы запустите свой вторичный поток с помощью NSThread +detachNewThreadSelector:toTarget:withObject:, поток сохранит ваш объект, поэтому, если вы закончили с ним, вы можете освободить его, как это обычно бывает. Вы этого не делаете.

Второй предлагаемый метод — предоставить метод для обратного вызова после завершения фоновой операции. Поскольку вы используете NSURLConnection, и он уже предоставляет вам перехватчики обратного вызова, и на самом деле вы используете их для возврата загруженных данных, это похоже на путь.

Копирование изменяемого массива дает вам неизменяемую копию, которой вы владеете, поэтому она должна быть self.imagesDataSource = [[articleImagesParserObject.returnedArray copy] autorelease], если только imagesDataSource не сохраняет, что было бы неправильным.

person hooleyhoop    schedule 08.07.2010
comment
Если вы никогда не слышали о методах делегирования, значит, вы не читали документацию Apple. Шаблон делегирования используется повсеместно, и термин «метод делегирования» есть в документации для каждого класса, использующего этот шаблон. - person Chuck; 09.07.2010
comment
я думаю, у вас может быть объект делегата, который обязательно имеет методы. Но рассмотрим экземпляр NSTableView; Я не могу сказать: «Я хотел бы, чтобы [obj1 hasBeans] был методом делегата для textShouldBeginEditing:, я бы хотел, чтобы [obj78 isVisible] был методом делегата для textShouldEndEditing:. Нет, я могу установить объект делегата, но это все. Кроме того, ОП объединяет делегирование и обмен сообщениями. - person hooleyhoop; 09.07.2010
comment
Слияние? Ваш бездонно-пелагический ответ — это плеоназм, который затемняет любую информацию, которую он мог бы содержать ;-) Шутки в сторону, хотя метод делегата: en .wikipedia.org/wiki/Delegation_pattern cocoadevcentral.com/articles/000075.php - person Spider-Paddy; 09.07.2010
comment
Однако вы не говорите, как запускаете вторичный поток, и не публикуете никакого кода. Строка 3: у меня есть объект, который асинхронно загружает и анализирует XML-документ. NSURLConnection initWithRequest является асинхронным developer.apple.com/ mac/library/documentation/Cocoa/Conceptual/ (здесь также упоминаются методы делегирования). Способ, которым вы в настоящее время передаете данные, может быть в порядке или может быть катастрофой. Опять же, вы не говорите и не публикуете код. Строка 11: self.imagesDataSource = [статьяImagesParserObject.returnedArray копия]; - person Spider-Paddy; 09.07.2010
comment
Итак, вы используете NSURLConnection - извините, я пропустил невидимый бит строки 3, где вы это сказали. Если я прищурюсь, я могу видеть это сейчас. self.imagesDataSource = [articleImagesParserObject.returnedArray copy] подходит для вашего делегата NSURLConnection (кроме утечки). Могу ли я предложить вам указать NSURlConnection в заголовке вместо «асинхронный NSObject»? - person hooleyhoop; 09.07.2010