2013-06-06 1 views
1

Я создал модель под названием User, у которой есть свойство «name».Заполнение моей модели от данных на Facebook (<FBGraphUser>)

Я делаю запрос API facebook (используя последний SDK для iOS), идея заключается в том, что моя функция user.name, когда facebook возвращает данные.

facebook возвращает данные в блок startWithCompletionHandler, но я не могу установить эти данные в свой пользовательский объект, я могу получить доступ только к данным на startWithCompletionHandler. Когда я пытаюсь получить доступ к данным из блока, моя модель возвращает NULL.

Как я могу заполнить свою модель/объект, когда возвращается запрос facebook?

Моя текущая реализация метода:

+ (void)requestUserData:(User *)userModel { 
    if(FBSession.activeSession.isOpen) { 
    [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) { 
     if(user.name) [self setUserData:user userModel:userModel]; 
    }]; 
    } 
} 

+ (void)setUserData:(NSDictionary<FBGraphUser> *)user userModel:(User *)userModel { 
    userModel.name = user.name; 
} 

И призыв:

__block User *user = [[User alloc] init]; 
    [GFFacebookHelpers requestUserData:user]; 
    NSLog(@"user: %@", user.name); //this part prints 2013-06-06 18:03:43.731 FacebookClassTest[74172:c07] user: (null) 

Спасибо.

+0

Вы пытаетесь сопоставить 'данные FBGraphUser' к вашей модели или вы просто есть' name' свойство на вашей модели? – Daniel

+0

В настоящее время для тестирования у меня просто есть свойство «name», но после этого этот вопрос будет решен, я буду расширять мою модель, чтобы хранить основные данные пользователя facebook. – GodFather

ответ

2

SDK Facebook извлекается асинхронно, поэтому обработчик завершения, который вы написали, выполняется после возврата вспомогательного метода.

Итак, когда ваш метод возвращает объект User, ваш логически просто пустой пользователь (поскольку вы его уже назначили/инициализировали).

Когда вызывается блок завершения, этот объект пользователя обновляется, но к этому времени вы больше не обрабатываете его в своем приложении (контроллер просмотра).

Итак, вот мое предложение: либо используйте Facebook SDK непосредственно с контроллеров просмотра, либо если вы хотите сохранить всю эту логику в своем классе-помощнике, а затем измените его, чтобы ваш метод не возвращал данные, но он требует блока, который будет вызываться, когда запрос данных завершен, то более, как это:

+ (void)requestUserDataWithCompletionHandler:(void (^)(User *user, NSError *error))handler{ 
    if(FBSession.activeSession.isOpen) {   
     [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) { 
      if(!error){ 
       User *userData = [[User alloc] init]; 
       userData.name = user.name; 

       dispatch_async(dispatch_get_main_queue(), ^{ 
        handler(userData, nil); 
       }); 
      } 
      else{ 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        handler(nil, error); 
       }); 
      } 
     }]; 
    } 
} 

Примечание Я завернул вызов блока обработчика в dispatch_async() в основную очередь, чтобы убедиться, что вы полезно перейти к обновлению любого пользовательского интерфейса.

метод ваш взгляд контроллера теперь будет выглядеть следующим образом:

- (void)updateStatusLabels { 
    if([GFFacebookHelpers isLogged]){ 
     [GFFacebookHelpers requestUserDataWithCompletionHandler:^(User *user, NSError *error) { 
      if(!error){ 
       self.fbStatus.text = user.name; 
       [_loginButton setTitle:@"Logout" forState:UIControlStateNormal]; 
      } 
     }]; 
    }else{ 
     self.fbStatus.text = @"You need to login"; 

     [_loginButton setTitle:@"Login" forState:UIControlStateNormal]; 
    } 
} 
+0

Daniel, я допустил ошибку на примере моего кода. Я устанавливаю userModel.name следующим образом: 'userModel.name = user.name' без цикла. Я исправил это на пост. Я уже выполнил ваш код предложения, но я продолжаю получать NULL, когда я вызываю '__block User * user = [[User alloc] init];' '[GFFacebookHelpers requestUserData: user];' 'NSLog (@" user:% @ " , user.name); ' – GodFather

+0

Если у вас есть демонстрационный проект, который я могу скачать, я с удовольствием рассмотрю его поближе. – Daniel

+0

Daniel, я поставил демо, где я здесь работаю: git: //github.com/godfather/facebookclasstest.git не стесняйтесь изменять то, что вы хотите. PS: Я сделал некоторые изменения после последнего примера, который я разместил здесь. Спасибо – GodFather

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