Я работаю над этим несколько часов и становлюсь тупым. Я, вероятно, делаю что-то лишнее или глупое, что вызывает эту проблему, поэтому любая помощь, которую я могу получить, будет высоко оценена.iOS: NSXMLParser - Добавить значения атрибутов в UITableView
Я использую NSURL, чтобы вытащить сайт: http://undignified.podbean.com/feed. Отсюда я использую NSXMLParser для синтаксического анализа страницы XML и поиска элемента «enclosure» elementName. Элемент «enclosure» содержит атрибут «url», который содержит URL-адрес для Mp3. Парсинговая часть работает, и я могу NSLog из содержимого массива, и я проверил, что все доступные URL-адреса присутствуют, но я не могу заставить это загружать в UITableView, он просто загружается как пустой. Мой массив, в который загружаются значения атрибутов parsed out, в _podAllEntries будет записываться на консоль со значениями в dispatch_async, но когда любая другая часть моего ViewController обращается к этому массиву, она пуста. Я думаю, так как async вызывается в фоновом потоке, возможно, какой-то делегат должен быть реализован, чтобы другие методы могли получить доступ к значениям в этом массиве? Возможно, я ошибаюсь.
Подводя итог, я пытаюсь подключиться к RSS-каналу (xml-страница), проанализировать атрибут, называемый «url», и собрать его значение, а затем загрузить URL-адреса в tableView. Мой код приведен ниже. Пожалуйста, не стесняйтесь комментировать, если я неясен или неоднозначен ни на чем.
UnDigParser.h - класс используется для анализа http://undignified.podbean.com/feed
@interface UnDigParser : NSXMLParser <NSXMLParserDelegate> {
}
@property (retain) NSMutableArray *links;
@end
UnDigParser.h - файл реализации:
#import "UnDigParser.h"
@implementation UnDigParser
NSMutableArray *_links;
@synthesize links = _links;
-(void)parserDidStartDocument:(NSXMLParser *)parser{
_links=[[NSMutableArray alloc] init];
}
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
if ([elementName isEqualToString:@"enclosure"]){
NSString *link = [attributeDict objectForKey:@"url"];
if (link){
[_links addObject:link];
}
}
}
-(BOOL)parse{
self.delegate = self;
return [super parse];
}
@end
ViewController.h файл:
@interface getpodViewController : UITableViewController <UITableViewDataSource>{
NSMutableArray *_podAllEntries;
NSMutableArray *_allEntries;
}
@property(retain) NSMutableArray *podAllEntries;
@property(retain) NSMutableArray *allEntries;
@end
ViewController.M файл:
#import "getpodViewController.h"
#import "PodcastEntry.h"
#import "UnDigParser.h"
@implementation getpodViewController
@synthesize podAllEntries = _podAllEntries;
@synthesize allEntries = _allEntries;
-(void)addRows{
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSURL *url = [NSURL URLWithString:@"http://undignified.podbean.com/feed"];
UnDigParser *parser = [[UnDigParser alloc] initWithContentsOfURL:url];
[parser parse];
[_podAllEntries addObject:parser.links];
NSLog(@"%@", _podAllEntries);
});
}
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"Podcasts";
self.podAllEntries = [[[NSMutableArray alloc]init]autorelease];
[self addRows];
for (UnDigParser *entry in _podAllEntries){
[_allEntries insertObject:entry atIndex:0];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:0 inSection:0]]
withRowAnimation:UITableViewRowAnimationRight];
}
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return [_podAllEntries count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(cell==nil){
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
}
NSString *cellValue = [_podAllEntries objectAtIndex:indexPath.row];
cell.textLabel.text = cellValue;
return cell;
}
- (void)dealloc {
[super dealloc];
[_podAllEntries release];
_podAllEntries = nil;
}
@end
Вопрос был фактически связан с методом cellForRowAtIndexPath. При попытке заполнить ячейки я использовал простой NSString для объекта NSMutableArray, который не разрешен. Изменен код: NSString * cellValue = [NSString stringWithFormat: @ "% @", _podAllEntries]; cell.textLabel.text = cellValue; Это заполняет ряд, но не все из них. Это улучшение по сравнению с предыдущим, поскольку приложение либо сбой, либо вообще ничего не отображает. Я создам новый вопрос, если я получу тупик. – Fostenator