2016-08-15 15 views
-1

私はSwiftを初めて使用しています。同期呼び出しに関する質問があります。 dataTaskWithRequestを同期呼び出しして、dataTaskWithRequestが終了するとreturnメソッドが呼び出されるようにしたいと思います。ここに私のコードです:dataTaskWithRequestの呼び出しが完了するまでスウィフト待ち

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

ありがとうエバ、アイはなかったそれを試してください – 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

ありがとうNikolai!それは正常に動作します – user3149877

1

これを行うための最善の方法は、コールバック関数です。

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

のように、この関数を呼び出すことができます。

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を使用します。

let url = NSURL(string: "http://www.google.com")! 
let req = NSURLRequest(URL: url) 
let data = sendRequest(req) 
print("This is data: \(data)") 
関連する問題