2016-04-12 2 views
-1

У меня есть приложение быстрой iOS с бэкэндом Firebase. Я пытаюсь реализовать логику в своем AppDelegate, которая извлекает данные пользователя перед представлением контроллера представления, но, насколько мне известно, единственным способом получить данные является асинхронная функция observeEventType. Проблема в том, что большая часть пользовательского интерфейса должна быть заполнена информацией пользователя, поэтому я не хочу, чтобы моя функция AppDelegate didFinishLaunchingWithOptions завершилась, прежде чем я получу информацию о пользователе. Кто-нибудь знает, как исправить мою проблему?Есть ли способ синхронно получать данные от Firebase (Swift)?

Edit:

бы идея сессий исправить мою проблему? Значение, если пользователь вошел в систему один раз, является его сеансом активным навсегда (если они не выходят из системы), в этом случае я мог бы использовать синхронную функцию authData?

+1

Если вы используете синхронный подход, то все ваше приложение будет висеть, и это плохой пользовательский интерфейс. Лучше показать пользователю, что данные загружаются, например, UIActivityView, а затем обновлять интерфейс после загрузки данных. – Paulw11

+0

Спасибо. Я действительно верю, что делаю редактирование, пока вы прокомментировали, сможете ли вы ответить на вопрос, заданный в редактировании? @ Paulw11 – rigdonmr

+0

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

ответ

0

Вы не разместили свой код, так что непонятно, почему didFinishLaunchingWithOptions используется, поскольку существует множество других опций.

Для простого примера, используя раскадровку, создайте контроллер входа в систему как точку входа в раскадровку. Затем в этом представлении контроллер фиксирует адрес электронной почты и пароль для входа в систему, аутентифицирует и продолжает поток через ваше приложение.

ref.authUser(userName, password: password) { error, authData in 

     if error != nil { 
      print("No auth for you, two weeks") 
     } else { 
      print("authenticated as \(authData.uid)") 

      //now set up your app, populate user info etc. 
      // even calling back to the delegate would work. 

     } 
    } 
+0

Но поскольку 'authData' является асинхронным, не удалось загрузить пользовательский интерфейс до завершения блока завершения, в результате чего многие компоненты пользовательского интерфейса инициализируются данными nil? – rigdonmr

+0

@rigdonmr Не совсем. Возможно, вам понадобится иметь некоторый компонент нагрузки пользовательского интерфейса, прежде чем пользователь сможет выполнить авторизацию. Экран входа, например, который захватывает электронную почту и пароль и передает его в блок ref.authUser. Обратите внимание, что мы не загружаем другие элементы пользовательского интерфейса до тех пор, пока блок не будет выполнен. Таким образом, вы гарантированно работаете в асинхронном режиме и не действуете на данные, пока Firebase не вернет данные. – Jay