Ios 公共函数仅在从初始视图控制器调用时有效,而不是在segue之后
就我自己的学习而言,我正在尝试将一个关于解析json的示例项目改编成一个Xcode项目,但我遇到了一个问题,我认为这表明我严重不理解其中的一些内容 我有一个叫做DataManager的公共类。该类中包含以下函数:Ios 公共函数仅在从初始视图控制器调用时有效,而不是在segue之后,ios,swift,Ios,Swift,就我自己的学习而言,我正在尝试将一个关于解析json的示例项目改编成一个Xcode项目,但我遇到了一个问题,我认为这表明我严重不理解其中的一些内容 我有一个叫做DataManager的公共类。该类中包含以下函数: public class func getTopAppsFromItunesNativeParse(completion: @escaping (_ appsFromItunes: [String]) ->()) { var appsFromItunes =
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)
}
}
是的,我知道我有不完整的错误处理。我还没走那么远。此外,有效负载只是[String:AnyObject]的类型别名
无论如何,这个函数要做的是创建一个带有url的dataTask,url已经是字符串,解析结果数据并调用转义闭包。然后,我使用DispatchGroup确保dataTask在使用appsFromItunes数组调用转义闭包之前完成,现在应该填充该数组
所有这些的目标是从url中检索iTunes上的顶级应用程序列表
现在,当我在viewDidLoad中使用以下内容运行项目时,这一点就起作用了:
DataManager.getTopAppsFromItunesNativeParse { (apps) in
print("this is apps \(apps)")
}
这将打印出一个包含iTunes上顶级应用程序名称的大数组。
但是,在我的项目中,当我切换到另一个视图控制器时,在它的viewDidLoad中,使用相同的对getTopAppsFromItunesNativeParse的调用,“apps”数组总是空的
我尝试了一些不同的方法,例如将函数更改为在url会话中必须传递的位置,但我所尝试的一切都感觉像是暗中捅了一刀,即使我的一次尝试成功了,我也不确定是否能够解释原因。这才是真正困扰我的。我可能可以通过在prepareForSegue中传递所需的数据来实现这一点,但我真的想知道为什么它不能以这种方式工作
编辑:这个问题已经回答了。见评论 从
DataManager
外部调用函数时,是否仍在设置DataManager.topAppURL
?如果该字符串为空,则看起来什么也不会发生。group.leave必须位于datatask closure.Paulw11中。您完全正确。我需要将group.leave移动到dataTask闭包内部。显然,我对dipatchGroups和dataTask构造了解不够。谢谢。从DataManager
外部调用函数时,是否仍在设置DataManager.topAppURL
?如果该字符串为空,则看起来什么也不会发生。group.leave必须位于datatask closure.Paulw11中。您完全正确。我需要将group.leave移动到dataTask闭包内部。显然,我对dipatchGroups和dataTask构造了解不够。非常感谢。