Как да отделя UITableView от данни, анализирани от интернет?

Имам UITableView, който е попълнен с анализирани XML елементи от Интернет.

Всичко работи добре, но бих искал да отделя кода за анализ на XLM елементите от UIViewController, който отговаря за попълването на това UITableView.

Опитах да направя подклас на UIViewController, но изглежда, че причинява много проблеми със свързването.

Кой е най-добрият начин да отделите този XML асинхронен парсер код и след това да подадете неговите резултати към UIViewController, който съдържа UITableView?

Не разбирам много от делегатите, но това ли е начинът?

Благодаря!


person neowinston    schedule 02.08.2012    source източник


Отговори (2)


Напишете обект, който обработва анализирането, създайте негов екземпляр във вашия контролер за изглед и след това го извикайте, за да заредите данните:

@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;
}

Това не е работещ код, но трябва да ви насочи в правилната посока, особено ако вече имате работещ код за анализ. Освен това, ако обичате Blocks... можете да замените протокола с препратка към Block, за да свършите работата, след като анализирането приключи.

person jerrylroberts    schedule 02.08.2012

Вашият модел трябва да се справи с извличането и анализирането на данните, след което, когато е готово, можете да използвате 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];
}
person Eyal    schedule 02.08.2012