2012-01-18 1 views
2

Я никогда не касался нитей раньше, и по внешнему виду мне, возможно, придется немного вникать в них, но мне было интересно, было ли более простое решение проблемы ниже.Использовать 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: обертки, то есть при создании списка.

ответ

2

Я не уверен, что я понимаю ваш вопрос, но вы можете посмотреть в NSNotificationCenter. Вы можете использовать его для отправки сообщений на контроллеры, вот пример запуска уведомления:

[[NSNotificationCenter defaultCenter] postNotificationName:@"myNotificationName" 
                 object:self 
                 userInfo:[NSDictionary dictionaryWithObject:XXXX forKey:@"someObject"]]; 

Как вы можете видеть, вы даже можете отправить ему параметры. И в целевом контроллере вы просто регистрируете наблюдателя для ответа на эти сообщения:

С уважением!

+0

Выглядит многообещающе - я дам это, спасибо – Smikey

+0

Хорошо, что почти сработало. Теперь он ожидает уведомления перед загрузкой FriendsVC, но он все еще загружает пустую первую раз ... пока я не вернусь и не нажму кнопку второй раз.Я также получаю эти ошибки в выходе: вложенная анимация push может привести к повреждению навигационной панели, завершению перехода навигации в неожиданном состоянии. Дерево видимости панели навигации может быть повреждено, а небалансные вызовы для перехода на начало/конец перехода для . Как он описывает, панель навигации, похоже, дублируется. Это связано с уведомлениями? – Smikey

+0

На самом деле я, кажется, удалил эти ошибки, удалив наблюдателя при загрузке FriendsVC ([[NSNotificationCenter defaultCenter] removeObserver: self name: @ "ListReady" object: nil];) Однако он все еще не загружает список в первый раз. .. будет продолжать расследовать, но это выглядит хорошо. – Smikey

2

Это просто. Поместите код загрузки VC в метод didReceiveResponce. И показать UIAlertView в didFailWithError.

- (void)request:(FBRequest *)request didReceiveResponse:(NSURLResponse *)response { 
    NSLog(@"Response received"); 

    //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]; 
} 
+0

За исключением того, что класс оболочки, содержащий метод didReceiveResponse, не имеет навигационного контроллера, на который нужно нажать FriendsVC ...? – Smikey

+0

Или есть способ получить доступ к текущему контроллеру навигации из экземпляра класса-оболочки? – Smikey

+0

Это ваш класс обертки. Таким образом, вы можете просто добавить свойство для контроллера навигации в этом классе. и заполните его, когда вы создаете свой класс-оболочку внутри FriendsVC. –

Смежные вопросы