Я размышлял над днем о одной зависимости, с которой я столкнулся. Я новичок в Objective-C, поэтому, пожалуйста, успокойтесь. Я даже не знал, как решить проблему, с которой я столкнулся.Зависимость трех классов - возвращаемые данные
У меня есть три класса:
RootViewController
HttpRequestWrapper
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
, который виден в данный момент.
Извините, я не скопировал правильную вставку последней части команд if. Виноват. Теперь я отредактировал сейчас со всеми Ifs. Вся цель кода заключается в том, что я загружаю таблицу после представления представления и в следующий раз хочу обновить данные таблицы, если на сервере есть изменения. Поэтому во второй раз я вызываю getTableData из класса Management, но мне нужно уведомить RootViewController, когда данные закончили загрузку и перезагрузку данных. – Lily
Мне удалось вызвать [[self.navigationController topViewController] populateTableData]; в классе httpRequestWrapper с помощью этого метода: MyAppDelegate * appDel = (MyAppDelegate *) [[UIApplication sharedApplication] delegate]; а затем [[appDel.navigationController topViewController] populateTableData]; Я думаю, что это не лучшее решение, но все работает отлично. – Lily