Используйте многопоточность, чтобы дождаться выполнения метода другого класса, или есть более простой способ? - PullRequest
2 голосов
/ 18 января 2012

Я никогда раньше не затрагивал темы, и, судя по всему, мне, возможно, придется немного вникнуть в них, но мне было интересно, есть ли более простое решение проблемы ниже.

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

Ответы [ 2 ]

2 голосов
/ 18 января 2012

Это просто. Поместите ваш код загрузки 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];
}
2 голосов
/ 18 января 2012

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

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

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

[[NSNotificationCenter defaultCenter] addObserver: self
                                             selector: @selector(yourMethodHere:) 
                                                 name: @"myNotificationName"
                                               object: nil];

Привет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...