2016-09-20 70 views
0

我剛開始使用iPhone開發,並感謝許多人在那裏,我得到了一個簡單的應用程序工作。我正在使用下面的代碼從MySQL數據庫中提取數據。代碼位於commonfun.swift文件中,我保存所有的函數,並且在需要時調用各種swift文件。由於通信鏈接,它會嘗試30秒。Swift Xcode NSURLConnection.sendSynchronousRequest已棄用

這一切都很好。它同步,因爲它將數據加載到函數「結尾」的數組中,並「返回」到調用的swift文件。

樣品編號如下:

import UIKit 
class commonfunc 
{ 
    var result1: [String] = []; 

func DB_To_Array_Swift(whattoget: String, inout jsondata: NSDictionary) 
    ... set up stuff 
    ... call php to get data 
while while_exit == "NO" 
    { 
     number_of_retries = number_of_retries + 1 
     if number_of_retries > 30 
     { 
      break 
     } 
     do 
     { 
      urlData = try NSURLConnection.sendSynchronousRequest(request, returningResponse:&response) 
      while_exit = "YES" 
     } 
     catch let error as NSError 
     { 
      tmperror = error 
      while_exit = "NO" 
      sleep(1) 
     } 
    } 
... load data into an array and return to calling swift file. 

的偉大工程!並從不同標準的各種swift文件中調用。

現在它說NSURLConnection.sendSynchronousRequest折舊。

我試圖用NSURLSession.sharedSession()替換它,但它運行異步並返回到主swift文件。

我試圖用下面的替換它。但是.....

while while_exit == "NO" 
    { 
     number_of_retries = number_of_retries + 1 
     if number_of_retries > 30 
     { 
      while_exit == "YES" 
      break 
     } 
      let session = NSURLSession.sharedSession() 
      let task = session.dataTaskWithRequest(request) 
      { 
       (
       let urldata, let response, let error) in 
       if error != nil 
       { 
        tmperror = error! 
        while_exit = "NO" 
        sleep(1) 
       } 
       let dataString = NSString(data: urldata!, encoding: NSUTF8StringEncoding) 
       print(dataString) 

       while_exit = "YES" 
      } 
      print("\n here5") 
      task.resume() 
      print("\n here6") 

    } 
    while while_exit == "NO" 
    { 
     sleep(1) 
    } 

我有辦法使它看起來同步在commonfunc.swift

感謝

+0

'sleep'很不好,同步網絡是非常壞。始終有一種使用異步模式的方法。在你的情況下使用'NSURLSession'和'NSURLSessionDataTask'並實現委託方法。在'didCompleteWithError'中,啓動一個計時器並在出錯時重新運行任務,或者從接收到的數據創建字符串並繼續*將數據加載到數組中並返回調用swift文件*。 – vadian

回答

0

VAR數據:NSData的? =零 讓旗語:dispatch_semaphore_t = dispatch_semaphore_create(0) 令任務= NSURLSession.sharedSession()dataTaskWithRequest(請求,completionHandler:{ taskData,_,錯誤 - >()在 數據= taskData 如果數據==零,讓誤差= {錯誤打印(誤差)} dispatch_semaphore_signal(旗語); }) task.resume() dispatch_semaphore_wait(旗語,DISPATCH_TIME_FOREVER) 返回數據

+0

經過上述測試,它的作品發現。 –

+0

信號也不好。 – vadian

+0

壞壞壞...所以你有什麼建議。 –