gpt4 book ai didi

ios - 如何使用 Alamofire 和 SwiftyJSON 保存 Json 数据?

转载 作者:行者123 更新时间:2023-11-29 05:41:50 25 4
gpt4 key购买 nike

我正在尝试使用这两个库将“author”数据从 json(Link:"https://learnappmaking.com/ex/books.json ") 保存到名为“authors”的全局变量。但它仅适用于 func Alamofire.request(url).responseJSON 的尾随闭包。 。当我从尾随闭包之外的某个地方访问名为“authors”的全局变量时,我得到的是一个空字符串数组。

有人可以解释一下这种奇怪情况背后的原因吗?非常感谢。

class ViewController: UIViewController {

var authors = [String]()
let url = "https://learnappmaking.com/ex/books.json"


func getAuthorsCount() {
print("the number of authors : \(authors.count)") // I hope that here, the number of authors should be 3 too! actually, it is 0. Why?

// this for loop doesn't get excuted
for author in authors {
print(author)
}
}

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.

Alamofire.request(url).responseJSON { response in
if let data = response.data {
if let json = try? JSON(data: data) {
for item in json["books"].arrayValue {
var outputString: String
print(item["author"])
outputString = item["author"].stringValue
//urlOfProjectAsset.append(outputString)
self.authors.append(outputString)
print("authors.count: \(self.authors.count)")
}
}
}
}

getAuthorsCount()
print("-------------")
}
}

实际输出是:

enter image description here


更新:我调整了我的代码:

class ViewController: UIViewController {

var authors = [String]()
let url = "https://learnappmaking.com/ex/books.json"


func getAuthorsCount() {
print("the number of authors : \(authors.count)")

// this for loop doesn't get excuted
for author in authors {
print(author)
}
}

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.

Alamofire.request(url).responseJSON { response in
if let data = response.data {
if let json = try? JSON(data: data) {
for item in json["books"].arrayValue {
var outputString: String
//print(item["author"])
outputString = item["author"].stringValue
//urlOfProjectAsset.append(outputString)
self.authors.append(outputString)
//print("authors.count: \(self.authors.count)")
}
self.getAuthorsCount() // I added this line of code.
}
}
}
getAuthorsCount()
print("-------------")
}
}

但是为什么func getAuthorsCount() (不是 self.version)仍然打印空字符串数组?我想结果应该和上面的结果是一样的 func self.getAuthorsCount()打印。我现在很困惑...同样,我想使用名为“authors”的变量中保存的数据,但我只得到一个空字符串数组。

最佳答案

我会尽力回答您的所有问题:

  • 数据是持久的

  • 您正在执行以下操作:Alamo.request(网络调用)-> getAuthors(打印结果 - 空)->response(接收响应)-> self.authors.append(保存响应)-> self.authors(打印结果)

  • 您需要执行以下操作:Alamo.request(网络调用)->response(接收响应)->self.authors.append(保存响应)->self.getAuthors 或 getAuthors(相同)(在响应内) {})

获得结果后,您需要在响应回调中调用 getAuthors :

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.

Alamofire.request(url).responseJSON { response in
if let data = response.data {
if let json = try? JSON(data: data) {
for item in json["books"].arrayValue {
var outputString: String
print(item["author"])
outputString = item["author"].stringValue
//urlOfProjectAsset.append(outputString)
self.authors.append(outputString)
print("authors.count: \(self.authors.count)")
}

self.getAuthorsCount()
print("-------------")
//Do whatever you want from here : present/push


}
}
}

然后您可以使用保存的数据:

  • 要将数据发送到另一个 ViewController,您可以使用各种方法(呈现/推送、关闭/回调...)
  • 通常您会有一个加载旋转器来等待网络回答然后你将显示你的下一个 Controller

关于ios - 如何使用 Alamofire 和 SwiftyJSON 保存 Json 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56481409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com