如何将UITableView与从Internet解析的数据分开?

时间:2012-08-02 19:17:19

标签: iphone cocoa-touch uitableview uiviewcontroller xml-parsing

我有一个UITableView,其中填充了来自Internet的已解析的XML元素。

一切正常,但我想分开代码来解析负责填充此UIViewController的{​​{1}}的XLM元素。

我尝试过对UITableView进行子类化,但似乎会导致许多耦合问题。

分离此XML异步解析器代码,然后将其结果提供给包含UIViewController的{​​{1}}的最佳方法是什么?

我对代表的了解不多,但这是要走的路吗?

谢谢!

2 个答案:

答案 0 :(得分:1)

您的模型应该处理数据的获取和解析,然后在完成后,您可以使用NSNotificationCenter向视图控制器通知新数据。
例如,您可以执行以下操作:

在你的模型中定义一些MyModelDidFinishFetchingDataNotification并在你完成提取和解析数据时调用它

然后,当您创建viewController时,将其添加为模型通知的观察者

- (id)init
{
    self = [super init];
    if (self) {
        //
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(handleMyModelDidFinishFetchingDataNotification:)
                                                     name:MyModelDidFinishFetchingDataNotification
                                                   object:nil];
    }
    return self;
}  

在viewDidLoad中告诉你的模型获取数据

- (void)viewDidLoad
{
    [super viewDidLoad];

    [self.myModel fetchNewDataFromServer];
}  

实现处理新数据的方法

- (void)handleMyModelDidFinishFetchingDataNotification:(NSNotification *)not
{
    NSArray *newData = [[not userInfo] objectForKey:@"someNewData"];

    // set the new data to the viewController data property
    self.myData = newData

    // update the UI
    [self.tableView reloadData];
}

答案 1 :(得分:1)

编写一个处理解析的对象,在视图控制器中创建一个实例,然后调用它来加载数据:

@protocol SomeXMLParserHandler <NSObject>

- (void) handleData:(NSArray *)data;

@end

@interface SomeXMLParser : NSObject<NSXMLParserDelegate>

@property (strong, nonatomic) id<SomeXMLParserHandler> handler;

- (void) parseSomeXMLFromURL:(NSString *)url
            andPassToHandler:(id<SomeXMLParserHandler>)handler;

@end

在此示例中, SomeXMLParser 会完成所有繁重工作,并在完成后将数组传回 SomeXMLParserHandler 。所以在你的视图控制器中你可以做类似的事情:

- (void) viewDidLoad
{
    [super viewDidLoad];

    SomeXMLParser *parser = [[SomeXMLParser alloc] init];

    [parser parseSomeXMLFromURL:@"http://someurl"
               andPassToHandler:self];
}

- (void) handleData:(NSArray *)data
{
    self.tableViewData = data;
}

这不是正常工作的代码,但它应该让你朝着正确的方向前进,特别是如果你已经有解析代码工作的话。此外,如果你进入Block ...你可以用一个Block引用交换协议,以便在解析完成后完成工作。