2015-07-23 3 views
0

Я пытаюсь добавить пользователя в первый раз, когда приложение открыто. Это добавление ответа ко мне с каким-то паролем, что мы называем Access Token. Маркер использует для доступа к службам API.Добавление пользователя перед запуском приложения

В любом случае, помимо этой истории, моя проблема заключается в первом открытии приложения, я могу добавить пользователя и получить токен, и я сохранил его как NSUserDefault, но я не могу связаться с API-сервисами, так как он пытается предоставлять услуги с нулевым значением. После обновления или повторного открытия приложения или переключения другого вида и обратно это представление решит проблему. Но только в первый раз он не может добраться до службы.

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

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    //Adding user. 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // User informations. 
    NSString *accessToken = [defaults objectForKey:@"accessToken"]; 
    if(accessToken == nil) 
     [APIClient AddUser]; 

    //Adding the inital viewController. 
    UIViewController *vc = [self viewControllerForSegmentIndex:self.typeSegmentedControl.selectedSegmentIndex]; 
    [self addChildViewController:vc]; 
    vc.view.frame = self.contentView.bounds; 
    [self.contentView addSubview:vc.view]; 
    self.currentViewController = vc; 
} 

Не вешайте с тем, что я делаю, добавляя начальную ViewController, а не которые пожалуйста как раз увидеть, что там происходит, как добавить пользователя, а затем инициализировать ViewController. Быть асинхронным - проблема, поэтому я ищу способ добавить пользователя до того, как приложение действительно запустилось или запущено.

Я не уверен в этом случае, если мне нужно добавить пользователя в application:didFinishLauncingWithOptions, но я не думаю, что это проблема.

+3

Пожалуйста, удалите свое изображение и замените его блоком кода. –

+0

Я бы хотел, но это скорее так. Потому что я на окнах, но я арендую mac, который является удаленным подключением. Если это действительно необходимо, я могу попробовать, но соединение настолько медленное, что я могу сделать примерно 10-15 минут, что является полной болью. Надежда, а не длинный код, может вас убедить. Опять же, извините. –

+0

Проголосовали. Поэтому я добавляю как можно скорее. –

ответ

1

Хорошо, поэтому первое, что я хотел бы сделать, это извлечь код, связанный с токеном, в функцию контроллера. Давайте назовем это tokenReceived:

-(void) tokenReceived{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // User informations. 
    NSString *accessToken = [defaults objectForKey:@"accessToken"]; 
    if(accessToken == nil) 
     [APIClient AddUser]; 

    //Adding the inital viewController. 
    UIViewController *vc = [self viewControllerForSegmentIndex:self.typeSegmentedControl.selectedSegmentIndex]; 
    [self addChildViewController:vc]; 
    vc.view.frame = self.contentView.bounds; 
    [self.contentView addSubview:vc.view]; 
    self.currentViewController = vc; 
} 

По мнению же нагрузка добавить следующее:

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

затем добавить новый метод:

- (void) onGetToken 
{ 
    [self tokenReceived] 
} 

и, конечно же, когда вы получаете маркер (в делегате приложения или где вы извлекаете токен) отправите уведомление наблюдателю:

// your code, saving to nsuserdefualts etc. 
[[NSNotificationCenter defaultCenter] 
     postNotificationName:@"getToken" 
     object:self]; 

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

С другой стороны, это откроет экран пользователя, и вы можете поместить загрузчик, если хотите, до того, как уведомите контроллер вида, что у вас есть что-то. Таким образом, вы будете сохранять асинхронный характер сети и все еще обновлять пользовательский интерфейс, когда вы его получите. Если вы обеспокоены тем, что перед открытием контроллера просмотра вы получите токен, вы можете добавить tokenReceived, чтобы посмотреть загрузку.

Еще одна вещь, вы можете отправить NSNotification с объектом и получить его из объекта NSNotification, но в этом случае вам просто нужно сообщить, что что-то произошло, вам не нужны эти данные.

+0

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

+0

Уверенная вещь - я предполагаю, что в делете вашего приложения вы вызываете службу для получения токена. В блоке завершения вы отправляете уведомление наблюдателю, что у вас есть токен. Просто как тот. Уведомление о отправке уведомляет всех слушателей о том, что что-то произошло, и, как я уже упоминал в конце ответа, прямо сейчас нам ничего не нужно от уведомления, но позже в приложении вы можете отправить это, чтобы получить токен, или что-то подобное, и обрабатывать эти случаи также. – Miknash

+0

Да, я просто понял, что и писал, мне было жаль, что я спросил. Большое спасибо Ник, я попробую сразу. Большое спасибо. На самом деле просто просто отправить уведомление, когда я получаю токен. –

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