2013-06-13 2 views
0

Я пытаюсь добавить вход в Facebook для своего приложения с помощью SDK для iOS для Facebook.MBProgressHUD + Facebook SKD: Вложенные блоки

Поскольку запрос на серверы Facebook может занять некоторое время, я думал использовать MBProgressHUD. Проблема заключается в том, что как MBProgressHUD, так и FBRequest используют блоки, поэтому я ожидаю какого-то странного поведения.

Это код, который я использовал:

MBProgressHUD *HUD = [[MBProgressHUD alloc] initWithView:self.view]; 
[self.view addSubview:HUD]; 

HUD.delegate = self; 
HUD.labelText = @"Loading"; 
HUD.minSize = CGSizeMake(135.f, 135.f); 

[HUD showAnimated:YES whileExecutingBlock:^{ 

    [FBSession openActiveSessionWithReadPermissions:@[@"email"] allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 

     if (error) { 
      HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"error"]]; 
      HUD.mode = MBProgressHUDModeCustomView; 
      HUD.detailsLabelText = error.localizedFailureReason; 
      HUD.labelText = @"Error"; 

     } 

     if (state == FBSessionStateClosedLoginFailed) { 
      [FBSession.activeSession closeAndClearTokenInformation]; 
     } 
     if (FBSession.activeSession.isOpen) { 



      [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) { 

       if (!error) { 
       //Save User's Data 


        HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"37x-Checkmark.png"]]; 
        HUD.mode = MBProgressHUDModeCustomView; 
        HUD.labelText = @"Logged in"; 

       } else { 
        HUD.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"error"]]; 
        HUD.mode = MBProgressHUDModeCustomView; 
        HUD.detailsLabelText = @"An error occurred, please retry later"; 
        HUD.labelText = @"Error"; 
       } 
      }]; 
     } 

    }]; 
    sleep(2); 
} completionBlock:^{ 

    //Return to previous page 

}]; 

Проблема заключается в том, что, когда я нажимаю кнопку, связанную с этим методом, я вижу прогресс HUD менее чем за секунду, то я принес обратно на предыдущей странице.

Что бы я хотел видеть, это HUD, отображаемый во время всего процесса.

Может ли кто-нибудь сказать мне, как это сделать?

Благодаря

ответ

1

Проблема заключается в том, что showAnimated:whileExecutingBlock: закрывает HUD сразу после того, блок завершается. Метод аутентификации facebook выполняет код в фоновом режиме и немедленно возвращается. Вместо этого попробуйте просто показать HUD и спрятать его в блоках завершения Facebook.

-(void)yourMethodThatLogsIntoFacebook { 
    MBProgressHUD *HUD = [[MBProgressHUD alloc] initWithView:self.view]; 
    [self.view addSubview:HUD]; 

    HUD.delegate = self; 
    HUD.labelText = @"Loading"; 
    HUD.minSize = CGSizeMake(135.f, 135.f); 

    [HUD show:YES]; 

    [FBSession :@[@"email"] allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
     if (error) { 
      [self updateHud:HUD withImage:@"error" text:@"Error" detailText:error.localizedFailureReason]; 
     } 
     if (state == FBSessionStateClosedLoginFailed) { 
      [FBSession.activeSession closeAndClearTokenInformation]; 
     } 
     if (FBSession.activeSession.isOpen) { 
      [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) { 
       if (!error) { 
       //Save User's Data 
        [self updateHud:HUD withImage:@"37x-Checkmark.png" text:@"Logged in" detailText:nil]; 
       } else { 
        [self updateHud:HUD withImage:@"error" text:@"Error" detailText:@"An error occurred, please retry later"]; 
       } 
      }]; 
     } 
    }]; 
} 

-(void)updateHud:(MBProgressHUD *)hud withImage:(NSString *)imageName text:(NSString *)text detailText:(NSString *)detailText { 
    hud.customView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:imageName]]; 
    hud.mode = MBProgressHUDModeCustomView; 
    hud.labelText = text; 
    hud.detailText = detailText; 
    [hud hide:YES afterDelay:2.]; 
} 
+0

Спасибо! Теперь это работает! – guidev