}
嘿,我在设置标签值时遇到问题。标签应显示我的JSON(链接-followers_url
变量)中数组中元素的数量。我致电alamo并使用该网址提出请求。当我在parseData()
方法中打印值时,得到正确的结果。当我在configureView()
和viewDidLoad()
中打印它时,我总是得到0。
设置标签文本也仅在parseData()
方法内起作用。有什么想法可以使它工作吗?
答案 0 :(得分:0)
Alamofire.request(url).validate().responseJSON { response in
self.parseData(data: response.data!)
}
以上请求在另一个后台线程上运行。 因此,当您调用函数callAlamo时,将在完成块中收到响应({response in)。因此,当您在调用Alamo之后调用print()时。尚未收到响应并调用了打印,因此值未更新。因此,请仅通过完成块对响应执行操作。 如果要设置标签写操作,请在完成块中的self.parseData之后设置标签代码({response in)。确保将其设置在主队列中,因为仅需在主队列上执行UI操作
以下问题将有助于在主线程上设置标签。
In Swift how to call method with parameters on GCD main thread?
您需要了解多线程概念才能更好地理解这一点。遵循此https://medium.com/@gabriel_lewis/threading-in-swift-simply-explained-5c8dd680b9b2
答案 1 :(得分:0)
您应该了解有关iOS解析技术的知识。然后学习如何使用类或结构创建模型。然后您将得到Idea。
您也应该研究Object Mapper。
答案 2 :(得分:0)
您正在处理异步操作。异步操作是分派的“操作”,需要您等待它们完成。考虑在Safari中加载网站。假设在浏览器中键入 stackoverflow.com ,加载微调器将通知正在加载某些内容。页面加载时,您显然看不到网页上的内容。只有一个空白页面。
您的请求也是如此。调用callAlamo
函数时,是在告诉应用程序开始加载某些内容。这要求您等待任务完成。如果您在服务器调用之后紧接着followersAndFollowingArray
中计算元素,那么您将获得空值,因为请求仍在等待完成。这就像在输入URL后假装立即查看 stackoverflow.com 网站。你不能。
这就是关闭派上用场的地方。您可以使用闭包在其他操作完成后执行某些操作。在这种情况下,我将触发Web请求,显示一个加载微调器,以通知用户正在加载某些东西,最后填充followersLabel
并停止动画。你可以做类似的事情
func callAlamo(url: String, completion: @escaping ([User]) -> Void) {
if Connectivity.isConnectedToInternet {
Alamofire.request(url).validate().responseJSON { response in
let userData = self.parseData(data: response.data!)
completion(userData)
}
}
}
另外,您需要让parseData
方法返回已解析的Users
数组,以便callAlamo函数可以使用它。
func parseData(data : Data) -> [User] {
do {
return try JSONDecoder().decode([User].self, from: data)
} catch let jsonErr {
print("Error serializing", jsonErr)
return [User]()
}
}
最后,您可以在callAlamo
方法内部执行configureView
函数,并在服务器请求完成后执行操作。在我们的例子中,我们要填充标签。
private func configureView(){
followersLabel.text = String(followers)
// Starting the loading animation
startAnimation()
callAlamo(url: "Hello") { userData in
// Assigning the callAlamo result to your followers array
// once the server request has been completed
self.followersAndFollowingArray = userData
// This will return the number you'd expect
print(self.followersAndFollowingArray.count)
// Stopping the loading animation
stopAnimation()
}
}
现在您可能没有startAnimation
和stopAnimation
方法,但是您可以随意实现它们,我只是想给您一个经典实现的想法。