2017-10-13 61 views
1

我是新來的swift 我有我的問題。 未分配變量。 測試變量爲什麼爲null?沒有問題在loop.you幫助寫你的代碼變量值爲空。爲什麼?

print(test.count)= 0爲什麼?

對不起初學英語

var test = "" 

ApiClient.shared.login(username:"acilrezervasyon" , password: "acilrezervasyon", successBlock: { (response, value) in 
    let accessToken = value!.accessToken 
    Utils.setToken(accessToken!) 

    //print(accessToken) 

    ApiClient.shared.allProvidersCars(alisKonum: "28", alisTarihi: "2017-11-22", alisSaati: "10:00", teslimKonum: "28", testlimTarihi: "2017-11-23", teslimTarihi: "2017-11-23", teslimSaati: "10:00", successBlock: { (response, value) in 
     let araclarDatasi = value!.data 
     // print(araclarDatasi) 

     if let results: NSArray = araclarDatasi as? NSArray { 
      results.forEach { veri in 
       let araclarModeli = AllProvidersCar(JSON: veri as! [String : Any]) 

       araclarModeli?.araclar.forEach { arac in 
        let arac = JSON(arac) 
        print(arac["ARACADI"]) 

        test = "emre" /**/ 
       } 
      } 
     } 
    }) 
}) 

print(test.count) 
+0

sory print(test) - > null – EieN

+0

你確定它不只是一個空字符串嗎?你也應該搜索異步函數的工作方式。 – TNguyen

回答

3

ApiClient.shared不會使主叫方等待從網絡檢索數據。它在異步時工作,因此當網絡操作完成時,它將獲取的數據傳遞到其成功塊。

因此,在時間allProvidersCars方法被調用時,你的程序將已經到達了打印test所以你​​之前,它會被打印出來就行了。

對於此特定示例,保持等待執行的最簡單方法是使用DispatchSemaphore。您創建一個信號量,在.allProvidersCars()開始工作之後立即在信號量上調用.wait(),以便代碼將等到您釋放信號量。並且您將在test已設置後釋放它

這裏是一個快速演示展示你是如何做到這一點在你的代碼:

(注意:永遠不要凍結主線程,所以我會在後臺排隊做到這一點)

var test = "" 

let queue = DispatchQueue.global(qos: .background) 
queue.async { 
    let semaphore = DispatchSemaphore(value: 1) 

    ApiClient.shared.login(..., successBlock: { .. in 
    ApiClient.shared.allProvidersCars(..., successBlock: { .. in 
     ... 
     if let results: NSArray = araclarDatasi as? NSArray { 
     ... 
     test = "emre" 
     } 
     semaphore.signal() 
    } 
    } 
    semaphore.wait() 
    print(test) 
} 
+0

你在錯誤的塊內有'wait'和'print'。它應該在第一個'ApiClient'塊之外。並且'signal'的調用需要在'if'塊之後,而不是在設置'test'之後。 – rmaddy