【发布时间】:2016-11-11 10:23:16
【问题描述】:
我正在尝试在我的 Swift 项目中进行 API 调用。我刚开始实现它,我正试图从调用中返回一个 Swift Dictionary。
但我认为我在完成处理程序上做错了! 我无法从我的 API 调用中获取返回值。
import UIKit
import WebKit
import SafariServices
import Foundation
var backendURLs = [String : String]()
class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {
@IBOutlet var containerView : UIView! = nil
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
self.getBackendURLs { json in
backendURLs = self.extractJSON(JSON: json)
print(backendURLs)
}
print(backendURLs)
}
func getBackendURLs(completion: @escaping (NSArray) -> ()) {
let backend = URL(string: "http://example.com")
var json: NSArray!
let task = URLSession.shared.dataTask(with: backend! as URL) { data, response, error in
guard let data = data, error == nil else { return }
do {
json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? NSArray
completion(json)
} catch {
#if DEBUG
print("Backend API call failed")
#endif
}
}
task.resume()
}
func extractJSON(JSON : NSArray) -> [String : String] {
var URLs = [String : String]()
for i in (0...JSON.count-1) {
if let item = JSON[i] as? [String: String] {
URLs[item["Name"]! ] = item["URL"]!
}
}
return URLs
}
}
第一个 print() 语句给了我正确的值,但第二个是“nil”。
有人对我做错了什么有建议吗?
【问题讨论】:
-
像这样声明你的字典,var backendURLs: [String : String] = [:]
-
调用是异步的,需要等待响应才能得到结果。为此,您的打印方法之一返回 nil。
-
@lubilis:感谢您的回答。我知道它是异步的,但我认为 completionHandler 会处理它
-
你说“第一个 print() 语句给了我正确的值,但第二个是“nil”。”,你的意思是
viewDidLoad()?第一个是回调内部的,第二个是回调外部的吗? -
@pbodsk 是的,第一个在回调内部,第二个在外部。
标签: ios swift urlsession