2016-08-15 4 views
-1

저는 Swift에 익숙하지 않습니다. 동기식 호출과 관련하여 질문이 있습니다. dataTaskWithRequest에 대한 동기식 호출을 만들고 싶습니다. 따라서 dataTaskWithRequest가 완료되면 return 메서드가 호출됩니다. 여기 내 코드 :dataTaskWithRequest가 return 호출을 완료 할 때까지 기다리십시오.

private func sendRequest (request: NSURLRequest) -> NSData{ 
    let session = NSURLSession.sharedSession() 
    var dataReceived: NSData = NSData() 
    let task = session.dataTaskWithRequest(request) { data, response, error in 
     if error != nil{ 
      print("Error -> \(error)") 
      return 
     } 
    dataReceived = data! 
    } 
    task.resume() 
    return dataReceived 
} 

가장 좋은 방법은 무엇입니까? 완성 처리기로 시도했지만 할 수 없습니다.

도움을 주셔서 대단히 감사합니다.

+0

감사합니다. Eva, ai did not no 그것을 바란다 – user3149877

답변

0

완료가 신속하고 올바른 방법입니다.

func sendRequest (request: NSURLRequest,completion:(NSData?)->()){ 

    NSURLSession.sharedSession().dataTaskWithRequest(request) { data, response, error in 
     if error != nil{ 
      return completion(data) 
     }else{ 
      return completion(nil) 
     } 
    }.resume() 
} 

과 전화 :

sendRequest(yourRequest) { data in 
     if let data = data { 
      // do something 
     } 
    }} 
+0

고마워 니콜라이! 잘 작동합니다. – user3149877

1

이 작업을 수행하는 가장 좋은 방법은 콜백 함수입니다.

private func sendRequest(request: NSURLRequest) -> NSData { 
    let session = NSURLSession.sharedSession() 
    var dataReceived: NSData = NSData() 
    let sem = dispatch_semaphore_create(0) 

    let task = session.dataTaskWithRequest(request) { data, response, error in 
     if error != nil{ 
      print("Error -> \(error)") 
      return 
     } 

     dataReceived = data! 
     dispatch_semaphore_signal(sem) 
    } 

    task.resume() 

    // This line will wait until the semaphore has been signaled 
    // which will be once the data task has completed 
    dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER) 
    return dataReceived 
} 

그런 다음이 같은 FUNC를 사용합니다 :

private func sendRequest (request: NSURLRequest, callback: (data: NSData) ->() { 
    let session = NSURLSession.sharedSession() 
    var dataReceived: NSData = NSData() 
    let task = session.dataTaskWithRequest(request) { data, response, error in 
     if error != nil{ 
      print("Error -> \(error)") 
      return 
     } 
     callback(data!) 
    } 
    task.resume() 
} 

당신은 당신이 같은 세마포어와 비동기 호출 동기를 설정할 수 있습니다이

self.sendRequest(request, { (data) in 
    //data is the data you get from the request 
} 
1

같은이 함수를 호출 할 수 있습니다

let url = NSURL(string: "http://www.google.com")! 
let req = NSURLRequest(URL: url) 
let data = sendRequest(req) 
print("This is data: \(data)") 
관련 문제