2015-01-13 2 views
0

Я написал некоторое время назад код, который регистрируется на веб-сайте с учетными данными, введенными пользователем, а затем переходит на определенную страницу для анализа информации там (используя NSURLConnectionDelegate).Быстрое/iOS8 Последовательные HTTP-запросы

func startConnection() { 
    var url = NSURL(string:"https://www.website.com/psp/ps/?cmd=login&languageCd=ENG") 
    var request = NSMutableURLRequest(URL: url!) 
    request.HTTPMethod = "POST" 

    let data = (dataString as NSString).dataUsingEncoding(NSUTF8StringEncoding) 

    request.HTTPBody = data 

    request.setValue("\(data!.length)", forHTTPHeaderField: "Content-Length") 
    request.setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") 
    request.setValue("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", forHTTPHeaderField: "Accept") 

    connection1 = NSURLConnection(request: request, delegate: self, startImmediately: false)! 

    connection1.start() 
} 

func connectionDidFinishLoading(connection: NSURLConnection) { 

    if (connection == connection1) { 
     let url = NSURL(string: "https://www.nexturl.com") 
     var request = NSMutableURLRequest(URL: url!) 
     connection2 = NSURLConnection(request: request, delegate: self, startImmediately: false)! 
     connection2.start() 

    } 

    if (connection == connection2) { 

     let url = NSURL(string: "https://www.nexturl.com") 
     var request = NSMutableURLRequest(URL: url!) 
     connection3 = NSURLConnection(request: request, delegate: self, startImmediately: false)! 
     connection3.start() 
    } 

    if (connection == connection3) { 
     let strData: NSString = NSString(data: responseData, encoding: NSUTF8StringEncoding)! 
     parse(strData) 


    } 

} 

Основная идея заключается в выпалить первоначальный запрос, а затем отправлять другие запросы от метода делегата connectionDidFinishLoading. Есть ли более чистый/лучший способ сделать такой последовательный вызов?

+1

Используйте рамки, такие как AFNetworking, отделяющую запрос HTTP логики от логики приложения, что дает вам простой блок обратного вызова, когда запрос заканчивается , Затем вы можете связывать запросы, выдавая новые запросы во вложенных блоках завершения. –

+0

Да, как сказал Дэвид, лучший способ - использовать основанную на закрытии инфраструктуру HTTP. AS в быстрой, функции закрытия, цепь будет очень чистой. Делегат окончательно не является решением в этом случае. Почему вы хотите последовательный вызов? Вам нужно повторно использовать данные с первого запроса на второй? Если нет, вы можете просто выполнить параллели Запросы? – LastMove

+0

ну, мне действительно нужно аутентифицировать логин. Я смотрю в alamofire, новое соединение. спасибо за ответы. – chris

ответ

2

Так что я сделал это с помощью рамки Alamofire (новая версия AFNetworking):

var loginRequest = NSMutableURLRequest(URL: NSURL(string:"login.com")!) 
    loginRequest.HTTPMethod = "POST" 

    loginRequest.HTTPBody = ("timezoneOffset=-600&userid1=\(username)&userid=\(username.capitalizedString)&pwd=\(pass)&x=31&y=12" as NSString).dataUsingEncoding(NSUTF8StringEncoding) 

    let manager = Alamofire.Manager.sharedInstance 

    // Chain requests 
    manager.request(loginRequest) 
     .responseString{ (request, response, string, error) in 
      if response!.statusCode == 500 { 
       return Error.InternalServerError 
      } 
      else { 

      manager.request(.GET, "www.redirect.com") 
       .responseString { (request, response, string, error) in 
        println(string) 
      } 
     } 
    } 
Смежные вопросы