使用JSON数据在标签上设置文本

时间:2018-11-22 08:01:43

标签: ios json swift parsing alamofire

}

嘿,我在设置标签值时遇到问题。标签应显示我的JSON(链接-followers_url变量)中数组中元素的数量。我致电alamo并使用该网址提出请求。当我在parseData()方法中打印值时,得到正确的结果。当我在configureView()viewDidLoad()中打印它时,我总是得到0。

设置标签文本也仅在parseData()方法内起作用。有什么想法可以使它工作吗?

3 个答案:

答案 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()
    }
}

现在您可能没有startAnimationstopAnimation方法,但是您可以随意实现它们,我只是想给您一个经典实现的想法。