2016-08-20 1 views
1

다음 코드는 훌륭하게 작동하지만 데이터 연결이 너무 느리면 시간 초과를 추가해야합니다.스위프트 3 URL 세션 - URL에 대한 시간 초과 추가

func preload(){ 

     let url = URL(string: "https://example.com/loadteams.php") 
     let data = try? Data(contentsOf: url!) 

     if data == nil{ 
       showAlert() 

      }else{ 
     values = try! JSONSerialization.jsonObject(with: data!, options: JSONSerialization.ReadingOptions.mutableContainers) as! [[String : AnyObject]] 

     } 

     } 

URLSession을이 사이트로 가져 가야한다고 가정합니다. 그러나 어떻게해야하는지 잘 모르겠습니다. 선을 따라 뭔가 있어야한다고 생각합니다.

let urlconfig = URLSessionConfiguration.default 
     urlconfig.timeoutIntervalForRequest = 5 
     urlconfig.timeoutIntervalForResource = 5 
     self.session = URLSession(configuration: urlconfig, delegate: self.delegates, delegateQueue: nil) 

이 당신은 dataTask(with:)를 호출 할 수있는 오류를 더 대표

+0

Alamofire와 같은 네트워킹 프레임 워크는 어떻게 사용합니까? 모든 가능성과 방법을 해결하는 강력하고 유용한 라이브러리입니다. 다른 네트워킹 상황에서 적용하면 많은 오류가 발생할 수 있습니다. – pedrouan

+1

내가 도울 수 있다면 나는 현재 어떤 프레임 워크도 사용하고 싶지 않다. – adamprocter

답변

3

가 없습니다 :

let session: URLSession = { 
    let configuration = URLSessionConfiguration.default 
    configuration.timeoutIntervalForRequest = 5 
    configuration.timeoutIntervalForResource = 5 
    return URLSession(configuration: configuration, delegate: nil, delegateQueue: nil) 
}() 

func preload(completionHandler: @escaping ([[String: AnyObject]]?) -> Void) { 
    let url = URL(string: "https://example.com/loadteams.php")! 

    let task = session.dataTask(with: url) { data, response, error in 
     if let data = data, let json = try? JSONSerialization.jsonObject(with: data, options: []), let array = json as? [[String: AnyObject]] { 
      DispatchQueue.main.async { 
       completionHandler(array) 
      } 
     } else { 
      DispatchQueue.main.async { 
       completionHandler(nil) 
      } 
     } 
    } 
    task.resume() 
} 

당신은 눈치 챘을 수도 있지만, 그것은 당신의 연주는 달리,이 비동기입니다. 따라서 완료 핸들러 패턴을 적용해야 할 것입니다. 그래서 완료 시점을 알 수 있습니다. 따라서 저는 호출자로부터 UI 업데이트를 개인적으로 수행합니다. 예 :

preload() { values in 
    guard let values = values else { 
     self.showAlert() 
     return 
    } 

    self.values = values 
    // trigger whatever UI update you want here 
} 
+0

확인할 수없는 식별자 세션이 있습니까? – adamprocter

+1

adamprocter, 정중하게 충분한 경고와 문제가되는 행을 제공하십시오. – pedrouan

+0

@Rob Ah 죄송합니다. NSArrary를 사용하지 않아 Swift 3 변경 사항에 최신 코드를 삽입하는 것을 잊어 버렸습니다. 값 = 시도하십시오! JSONSerialization.jsonObject (데이터 :, 옵션 : JSONSerialization.ReadingOptions.mutableContainers)를! [[String : AnyObject]] – adamprocter