Я никогда раньше не затрагивал темы, и, судя по всему, мне, возможно, придется немного вникнуть в них, но мне было интересно, есть ли более простое решение проблемы ниже.
Я просто отображаю список друзей пользователя 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 в моем делегате приложения, есть ли способ отправить текущему экземпляру сообщение из класса Wrapper?Так что я мог бы просто указать это refresh
в методе оболочки request: didLoadRawResponse:
, то есть когда список генерируется.