2015-04-25 5 views
1

У меня есть контроллер входа в систему и другой контроллер просмотра. Я хотел бы сделать это: когда пользователь нажимает логин, он отправляет свои учетные данные на удаленный сервер. Удаленный сервер возвращает ответ, указывающий, были ли учетные данные хорошими или нет, и если они были хорошими, приложение перенаправляется на другой контроллер просмотра.Как переключить представления в обработчике запроса NSURLSession

Код ниже сбой при вызове .performSegueWithIdentifier.

Катастрофа дает код ошибки EXC_BAD_ACCESS (код = 1, адрес = 0xbbadbeef)

Вопрос: какова Swifty способ сделать это?

var request = NSMutableURLRequest(URL: NSURL(string: "http://url.to/my/login/handler")!) 
var session = NSURLSession.sharedSession() 
request.HTTPMethod = "POST" 

//user initialized earlier 
bodyData = "email=\(user.username)&password=\(user.password)" 

request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding); 

var task = session.dataTaskWithRequest(request, completionHandler: {data, response, error -> Void in 
    // check that log in was successful by looking in 'response' arg 
    // if login was successful 
    self.performSegueWithIdentifier("SegueToOtherController", sender: self) 
    } 
task.resume() 
} 
+0

Поделитесь деталями аварии. Мы не можем диагностировать авария без каких-либо подробностей. – Rob

ответ

0

Если это сбой, вы должны поделиться деталями аварии, чтобы определить причину. Вероятно, проблемы включают в себя то, что он не нашел такой идентификатор, как «идентификатор раскадровки» от текущего контроллера представления до следующей сцены. Но невозможно точно сказать точную ошибку.

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

let request = NSMutableURLRequest(URL: NSURL(string: "http://url.to/my/login/handler")!) 
let session = NSURLSession.sharedSession() 
request.HTTPMethod = "POST" 

//user initialized earlier 
bodyData = "email=\(user.username)&password=\(user.password)" 

request.HTTPBody = bodyData.dataUsingEncoding(NSUTF8StringEncoding); 

let task = session.dataTaskWithRequest(request) {data, response, error in 
    // check that log in was successful by looking in 'response' arg 
    // if login was successful 
    dispatch_async(dispatch_get_main_queue()) { 
     self.performSegueWithIdentifier("SegueToOtherController", sender: self) 
    } 
} 
task.resume() 

Обратите внимание, я изменил все эти var ссылки на let (как правило, используют let везде, где это возможно). Кроме того, я не занимался этим здесь, но вы действительно должны быть проценты, избегая свойств username и password. Если, например, пароль включал любые зарезервированные символы, такие как + или &, это не получится. Есть много способов сделать это, например. что-то вроде метода, обсуждаемого здесь: https://stackoverflow.com/a/26317562/1271826 или https://stackoverflow.com/a/25154803/1271826.

+0

Спасибо! Это сработало. Для будущих Googlers, ошибка выглядит следующим образом: EXC_BAD_ACCESS (код = 1, адрес = 0xbbadbeef) п.с. спасибо, Ка позволяет и процент побега – user3261886

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