2017-10-13 63 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