Три класса зависимости - возвращение данных - PullRequest
0 голосов
/ 20 февраля 2012

Я целый день думал об одной зависимости, с которой я столкнулся.Я новичок в Objective-C, поэтому, пожалуйста, будьте спокойны со мной.Я даже не знал, как гуглить проблему, с которой столкнулся.

У меня есть три класса:

  1. RootViewController
  2. HttpRequestWrapper
  3. ManagementClass

Где RootViewController наследует ManagementClass.(@interface RootViewController : ManagementClass <UINavigationControllerDelegate>).

Поэтому в ManagementClass я вызываю эту функцию:

[[self.navigationController topViewController] getTableData]; 

, где topViewController - это RootViewController (но позже я хочу изменить его налюбой topViewController на данный момент).

Эта функция getTableData вызывает HttpRequestWrapper и в ней URLConnection вызывается со всеми ее делегатами.Но когда дело доходит до метода делегата - (void)connectionDidFinishLoading:(NSURLConnection *)connection Я хочу с помощью NSNotification уведомить RootViewController, что загрузка данных из запроса завершена, и заполнить таблицу данными.Но NSNotification не уведомляет RootViewController, хотя это topViewController в стеке навигации.

Поэтому мой вопрос состоит в том, как я могу вернуть данные из URLConnection в RootViewController, даже если запрос был инициализирован через ManagementClass.

Вот код моей проблемы:

Класс RootViewController:

#import "RootViewController.h"
......

//  Get the data using the class HttpRequstWrapper (where I wrap the request in NSURLConnection)
- (void) getTableData{
    httpRequestWrapper = [HttpRequestWrapper alloc];
    [httpRequestWrapper getXMLDataWithURL:[NSString stringWithFormat:@"equipment/xml"]];
}
- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // Get Table Data
    [self getTableData];
}

- (void) populateTableData{

    // Maybe change this line that error is shown if no data is found 
           if (httpRequestWrapper.dataFromTheHttpRequest == nil){
        NSLog(@"Data got from the HttpRequestWrapper is nil or empty");
    }

    // Parse the returned data 
    xmlcont = [[XMLController alloc] loadXMLByURL:httpRequestWrapper.dataFromTheHttpRequest];

    // Get the names of the Equipments as names of each Section
    arrayEquipments = [NSMutableArray alloc];
    arrayEquipments = xmlcont.equipments;
    sectionsTitles = [[NSMutableArray alloc]init];
    for (Equipment *eq in arrayEquipments){
        [sectionsTitles addObject: eq.equipmentName];
    }

    // Reload the data in TableView
    [self.tableView reloadData];
}

- (void) viewDidLoad{
    ....
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(populateTableData) name:@"connectionFinishedLoading" object:nil];

}

Класс ManagementClass: в файле .h

@interface ManagementClass : UITableViewController {}

в файле .m

@implementation ManagementClass

- (void) refreshPage {
    if ([[self.navigationController topViewController] isKindOfClass: [RootViewController class]]){ 
        [[self.navigationController topViewController] getTableData];
    } 
}

А в классе HttpRequestWrapper у меня есть:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
......
      if ([urlExtension rangeOfString: @"notification"].location != NSNotFound) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"connectionFinishedLoading1" object:nil];
        } else if ([urlExtension rangeOfString: @"execution/workflow"].location != NSNotFound) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"connectionFinishedLoadingPhaseView" object:nil]; execution/workflow

        } else if ([urlExtension rangeOfString: @"equipment/xml"].location != NSNotFound) {
        //[[self.navigationController topViewController] populateTableData];  - not working
        [[NSNotificationCenter defaultCenter] postNotificationName:@"connectionFinishedLoading" object:nil];
    }
.......
}

Я хочу, чтобы сделать контроллеры максимально пригодными для повторного использования.У меня была идея поместить [[self.navigationController topViewController] populateTableData] в connectionDidFinishLoading, но навигационный контроллер не может быть вызван из HttpRequstWrapper, он просто не выполняется.Я до сих пор не могу понять, почему.Я могу выполнять только методы navigationController с ViewController из View, который виден в данный момент.

1 Ответ

0 голосов
/ 20 февраля 2012

Из того, что я вижу, вы слушаете "connectionFinishedLoading" в RootViewController и публикуете "connectionFinishedLoading1" в HttpRequestWrapper. Они должны быть одинаковыми, чтобы RootViewController перехватывал их

...