对于我自己的学习,我正在尝试调整一个关于将json解析为Xcode项目的示例游乐场项目,但是我遇到了一个问题,我认为有一些问题我发现有一些我不认识的事情。
我有一个名为DataManager的公共类。在那个类中是这个函数:
public class func getTopAppsFromItunesNativeParse(completion: @escaping (_ appsFromItunes: [String]) ->()) {
var appsFromItunes = [String]()
let session = URLSession.shared
let topAppURLFromString = URL(string: DataManager.topAppURL)
let loadDataTask = session.dataTask(with: topAppURLFromString!) { (data, response, error) -> Void in
if let responseError = error {
} else if let httpResponse = response as? HTTPURLResponse {
if httpResponse.statusCode != 200 {
} else {
var json: Payload!
// 1
do {
json = try JSONSerialization.jsonObject(with: data! as Data, options: JSONSerialization.ReadingOptions()) as? Payload
} catch {
print(error)
}
// 2
guard let feed = json["feed"] as? Payload,
let apps = feed["entry"] as? [AnyObject]
else { print("sorry brah");return }
// 3
for topApp in apps {
guard let container = topApp["im:name"] as? Payload,
let appName = container["label"] as? String
else{print("bummer");return }
appsFromItunes.append(appName)
}
}
}
}
let group = DispatchGroup()
group.enter()
loadDataTask.resume()
group.leave()
group.notify(queue: .main) {
completion(appsFromItunes)
}
}
是的,我知道我的错误处理不完整。我还没到那么远。此外,Payload只是[String:AnyObject]
的类型别名无论如何,这个函数假设要创建一个带有我已经拥有的url作为字符串的dataTask,解析结果数据并调用转义闭包。然后我使用DispatchGroup来确保dataTask在使用现在应填充的appsFromItunes数组调用转义闭包之前完成。
所有这一切的目标是从网址中检索iTunes上的热门应用列表。
现在,当我在viewDidLoad中运行我的项目时,这是有效的:
DataManager.getTopAppsFromItunesNativeParse { (apps) in
print("this is apps \(apps)")
}
这会在iTunes上打印出一个包含顶级应用程序名称的大型数组。 但是,当我在我的项目中时,我会在其viewDidLoad中调用getTopAppsFromItunesNativeParse,同时调用另一个视图控制器," apps"数组总是空的。
我尝试了一些不同的东西,例如将功能更改为我必须通过网址会话传递的位置,但我尝试过的所有内容都感觉像是在黑暗中刺伤,即使我的某个尝试有效,我不确定我能否解释原因。这就是我的真正烦恼。我可以通过传递prepareForSegue中所需的数据来实现这一点,但我真的想知道它为什么不以这种方式工作。
编辑:这个问题已得到解答。看评论。