2014-10-14 3 views
0

Я пишу приложение Windows Phone 8, которое использует REST API для сбора данных. API требует аутентификации, поэтому всякий раз, когда я пытаюсь вызвать REST API, я должен проверить, аутентифицирован ли пользователь. Если пользователь не аутентифицирован, я хочу открыть окно входа в систему и дать пользователю возможность пройти аутентификацию. Это не проверка подлинности HTTP, но она использует настраиваемый экран входа в систему.Использование async-жду ожидания загрузки другого представления

Моя проблема: я хотел бы использовать await, чтобы дождаться аутентификации, но я не знаю, как это сделать, поскольку мне нужно открыть еще один вид. Вот псевдо-код для того, что я хотел бы сделать:

Метод LoadData:

async Task LoadDataAsync() { 
    bool authenticated = await AuthenticateAsync(); 
    if (authenticated) { 
     // do REST API stuff 
    } 
} 

И метод AuthenticateAsync:

async Task<bool> AuthenticateAsync() { 
    if (alreadyAuthenticated) 
     return true; 
    // not authenticated, so bring up a login view to let the user log in 
    // How do I do this in the context of async-await? 
} 

Таким образом, в методе AuthenticateAsync я хотел бы довести до когда пользователь должен аутентифицироваться. Но я не могу позвонить NavigationService.Navigate(), потому что это не дружит с асинхронным ожиданием, и я ничего не смогу ждать.

Каков правильный способ сделать это?

+0

Почему не поддерживается 'NavigationService.Navigate' async-wait? Вам просто нужно будет отобразить представление «загрузка» по умолчанию перед ожиданием, а затем отобразить либо вход в систему, либо основной вид. – McGarnagle

+0

Я не понимаю. Итак, вы говорите, что я могу «ждать NavigationSerivce.Navigate (...);», а затем получить результат аутентификации каким-то образом позже? Я не знаю, как это сделать. –

ответ

1

Я нашел ответ на этот вопрос. Я закончил использовать ответ здесь: https://stackoverflow.com/a/12858633/225560

В частности, я использовал объект TaskCompletionSource<bool>, который я мог тогда ждать. Затем я перешел в режим входа в систему, и он вызвал меня, когда логин был успешным. Затем я устанавливаю результат объекта TaskCompletionSource, который освободил мой ожидание и продолжит метод. Это закончилось тем, что работало почти так же, как делегат в объекте-C, в том, что вид входа в систему вызвал метод обратно в начальный класс при завершении входа.

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