Я никогда не касался нитей раньше, и по внешнему виду мне, возможно, придется немного вникать в них, но мне было интересно, было ли более простое решение проблемы ниже.Использовать threading, чтобы ждать выполнения метода другого класса, или есть более простой способ?
Я в основном показываю список друзей пользователя Facebook в UITableView
. У меня есть класс FacebookWrapper
, который содержит все мои методы Facebook и FacebookViewController
, который имеет множество кнопок/опций. Наконец, есть FriendsViewController
, в котором отображается список друзей. Пользователь может выбрать отображение списка друзей-мужчин или друзей-женщин, нажав соответствующую кнопку в FacebookViewController
.
Если они ударят, например, с мужскими друзьями, я использую FBL, чтобы создать строку запроса, которую я добавляю в словарь, и использовать для возврата списка друзей-мужчин (все в обертке).
[facebook requestWithMethodName:@"fql.query" andParams:dictionary andHttpMethod:@"GET" andDelegate:self];
метода делегата в классе обертки регулирует FBRequest
, который возвращается. У меня есть следующие методы, чтобы определить, что происходит, когда:
- (void)requestLoading:(FBRequest *)request {
NSLog(@"Loading...");
}
- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response {
NSLog(@"Response received");
}
- (void)request:(FBRequest *)request didFailWithError:(NSError *)error {
NSLog(@"Request failed");
}
- (void)request:(FBRequest *)request didLoadRawResponse:(NSData *)data {
NSLog(@"Request did load raw response");
}
Однако, когда я ударил кнопку «друзей-мужчин», например, я хочу подождать, пока ответ не генерируется до нажатия FriendsViewController
и отображения списка , В настоящее время, FriendsVC нажата до того, как запрос вернул список, и поэтому я получаю пустой список. Мне нужно дождаться, когда «Запрос загрузил необработанный ответ», прежде чем обновлять таблицу и отображать результаты. В настоящее время метод для вызова и отображения списка друзей в FacebookViewController
выглядит следующим образом:
- (IBAction)friendsButtonPressed:(id)sender {
int selectionTag = [sender tag];
//Get access to the instance of the wrapper in the app delegate (since it needs to remain refereced after app exits to log in and returns
MiniBfAppDelegate *appDelegate = (MiniBfAppDelegate *)[[UIApplication sharedApplication] delegate];
[appDelegate.facebookWrapper loadListDataFor:selectionTag];
//Initialise the friends view controller
FriendsViewController *friendsViewController = [[FriendsViewController alloc] init];
//NEED TO WAIT UNTIL LISTDATA IS RETURNED?
//Give the friends view controller the list data
friendsViewController.listData = appDelegate.facebookWrapper.friendsList;
//Push the friends view controller
friendsViewController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;
[self.navigationController pushViewController:friendsViewController animated:YES];
[friendsViewController release];
}
Так в идеале, я хотел бы, чтобы отобразить символ загрузки в то время как я жду обертки, чтобы вернуть список, и как только он делает, толкает FriendsViewController поэтому он населен немедленно. Так что мне нужно использовать потоки или есть более простой способ?
Возможно, это отвечает на мой собственный вопрос, и может случиться так, что я не могу понять фундаментальную концепцию здесь, но помимо создания экземпляра FriendsVC в приложении App Delegate, есть способ, которым я могу отправить текущий экземпляр сообщения из класса Wrapper? Поэтому я мог бы просто сообщить об этом refresh
в методе request: didLoadRawResponse:
обертки, то есть при создании списка.
Выглядит многообещающе - я дам это, спасибо – Smikey
Хорошо, что почти сработало. Теперь он ожидает уведомления перед загрузкой FriendsVC, но он все еще загружает пустую первую раз ... пока я не вернусь и не нажму кнопку второй раз.Я также получаю эти ошибки в выходе: вложенная анимация push может привести к повреждению навигационной панели, завершению перехода навигации в неожиданном состоянии. Дерево видимости панели навигации может быть повреждено, а небалансные вызовы для перехода на начало/конец перехода для. Как он описывает, панель навигации, похоже, дублируется. Это связано с уведомлениями? –
Smikey
На самом деле я, кажется, удалил эти ошибки, удалив наблюдателя при загрузке FriendsVC ([[NSNotificationCenter defaultCenter] removeObserver: self name: @ "ListReady" object: nil];) Однако он все еще не загружает список в первый раз. .. будет продолжать расследовать, но это выглядит хорошо. – Smikey