Просмотр и получение содержания
После получения объекта канала необходимо быть в состоянии получить информацию из него. Иногда эта информация содержит не только текст, но также и файлы в корпусах или дополнительном XML. Следующая глава описывает, какая информация доступна в записи и как получить доступ к нему.
Где моя запись?
Большая часть подачи содержит одну или более записей. Для получения записей от объекта канала используйте любого entries свойство (для массива объектов записи) или entryEnumeratorSortedBy: метод (для перечислителя объектов записи).
Объект записи содержит всю информацию, определенную для записи, такой как ее заголовок, ее URL, его авторы, его содержание, и, при необходимости, его корпуса. Большей частью этой информации является простая строка или URL. Однако три из компонентов немного более сложны.
В некоторых стандартах канала автор содержит не только имя, но также и содержит адрес электронной почты и домашнюю страницу (см. Форматы Канала). Информация автора в Подписке Публикации хранится в объекте автора. Объект автора представляет имя, адрес электронной почты, домашнюю страницу и ссылку к ABPerson объект.
Содержание записи также более сложно, чем простая строка. Это часто прибывает в одни из двух различных форм: или простой текст или форматированный текст HTML. В Подписке Публикации содержание и сводка записи сохранены как объекты содержания. Объект содержания содержит методы для получения содержания или как строка обычного текста или как строка HTML. Содержание возвращается в указанном формате, на основе которого используется метод доступа.
Корпус является способом присоединить файл к записи. Если запись будет содержать корпуса, то они будут соединены с объектом записи. Для получения дополнительной информации о корпусах, считайте Корпуса Загрузки.
Для распечатывания заголовка и содержания каждой записи в канале код был бы похож на Перечисление 4-1.
Перечисление 4-1 , Получающее доступ к каждой записи в канале
// Retrieve the entries as an unsorted enumerator |
NSEnumerator *entries = [feed entryEnumeratorSortedBy: nil]; |
PSEntry *entry; |
// Go through each entry and print out the title, authors, and content |
while (entry = [entries nextObject]) { |
NSLog(@"Entry Title:%@", entry.title); |
NSLog(@"Entry Authors:%@", entry.authorsForDisplay); |
NSLog(@"Entry Content:%@", entry.content.plainTextString); |
} |
Так как это следует шаблону разработки наблюдателя, Подписка Публикации может также уведомить Ваше приложение, когда любые изменения происходят с каналом. Регистр с уведомлением центрируется, чтобы быть предупрежденным, когда любое изменение происходит (PSFeedEntriesChangedNotification). Когда Ваш метод обратного вызова вызывается, измененные записи сохранены как пара ключ/значение в словаре информации о пользователе уведомления.
Загрузка корпусов
Некоторые записи могут содержать ссылки на файлы как корпуса. Подписка публикации обеспечивает функции, упрощающие загружать файлы в корпусе. Каждый корпус сохранен как объект корпуса в его связанном объекте записи. Поскольку может быть больше чем один корпус в записи, свойстве объекта записи enclosures возвращает массив объектов корпуса. В большинстве случаев этот массив только содержит один объект. Каждый из этих объектов содержит информацию о размере корпуса, URL и типе MIME.
По умолчанию корпуса автоматически не загружаются. Можно изменить эти настройки на основе на канал так, чтобы любой корпус от подписанного канала был загружен записью. Перечисление 4-2 показывает, как заставить канал загрузить свои корпуса автоматически.
Перечисление 4-2 , Загружающее корпуса автоматически
PSFeedSettings *settings = feed.settings; |
settings.downloadsEnclosures = YES; |
feed.settings = settings; |
Если Вы хотите загрузить файл в корпусах индивидуально, отправить download: к надлежащему объекту корпуса. download: метод является асинхронным, таким образом, он редко возвращает ошибку. Вместо этого проверьте состояние загрузки с downloadState свойство. Существует шесть возможных состояний:
PSEnclosureDownloadDidFailPSEnclosureDownloadDidFinishPSEnclosureDownloadIsIdlePSEnclosureDownloadIsQueuedPSEnclosureDownloadIsActivePSEnclosureDownloadWasDeleted
Если загрузка перестала работать, посмотрите то, что вызвало отказ при помощи downloadError метод. Если загрузка все еще активна, можно проверить ее прогресс при помощи downloadProgress метод. Принимая концы загрузки, расположение загруженного файла доступно с downloadedPath свойство.
Несмотря на то, что состояние загрузки может быть проверено синхронным способом, рекомендуется зарегистрироваться для уведомления PSEnclosureDownloadStateDidChangeNotification вместо этого. Когда Ваш метод обратного вызова вызывается, можно определить состояние загрузки. Перечисление 4-3 показывает, как начать загружать файл в корпусе и регистре для надлежащего уведомления. Перечисление 4-4 показывает метод обратного вызова для уведомления.
Перечисление 4-3 , Загружающее корпус
// Get the enclosures from the current entry, and retrieve the first one |
NSArray *enclosureArray = entry.enclosures; |
enclosure = [enclosureArray objectAtIndex: 0]; |
NSError *error; |
// Download the enclosure |
if (![enclosure download:&error]) { |
NSLog(@"Enclosure download failed: %@", error) |
} else { |
// Register for any changes to the download's state |
[[NSNotificationCenter defaultCenter] |
addObserver:self |
selector:@selector(downloadStateChanged:) |
name: PSEnclosureDownloadStateDidChangeNotification |
object: enclosure]; |
} |
Перечисление 4-4 , Получающее изменения состояния загрузки через уведомления
- (void) downloadStateChanged: (NSNotification *) sender { |
// See what state change cause the notification to be sent |
switch (enclosure.downloadState) { |
// If the download failed, log why and stop receiving notifications |
case PSEnclosureDownloadStateDidFail: |
NSLog(@"Enclosure download failed: %@", enclosure.downloadError); |
[[NSNotificationCenter defaultCenter] |
removeObserver: self |
name: PSEnclosureDownloadStateDidChangeNotification |
object: enclosure]; |
break; |
// If the download succeeded, log the location of the file and stop |
// receiving notifications |
case PSEnclosureDownloadStateDidFinish: |
NSLog(@"Location of downloaded file is: %@", enclosure.downloadedPath); |
[[NSNotificationCenter defaultCenter] |
removeObserver: self |
name: PSEnclosureDownloadStateDidChangeNotification |
object: enclosure]; |
break; |
case default: |
break; |
} |
} |
Дополнительный XML
Много подачи могут также содержать дополнительные элементы XML. Если дополнительные пространства имен используются в канале, используйте extensionXMLElementsUsingNamespace: метод для возврата массива NSXMLElement объекты. Передайте пространство имен URL, не префикс, к extensionXMLElementsUsingNamespace: метод. Если Ваш канал имел запись как этот в Перечислении 1-3, extensionXMLElementsUsingNamespace: возвращает массив четыре NSXMLElement объекты.
Перечисление 4-5 показывает, как найти определенный элемент в определенном пространстве имен в записи. В этом примере пространством имен является Подкаст iTunes.
Перечисление 4-5 , Получающее дополнительный XML от записи
// Find each element using the iTunes Podcast namespace |
for( NSXMLElement *elem in [entry extensionXMLElementsUsingNamespace: @"http://www.itunes.com/dtds/podcast-1.0.dtd"] ) { |
// Check if the element is called "keywords" |
if (NSOrderedSame == [[elem localName] isEqualToString:@"keywords"]) { |
// If it is, print the data from the element to the log |
NSLog(@"keywords:%@", [elem stringValue]); |
} |
} |