Ios 公共函数仅在从初始视图控制器调用时有效,而不是在segue之后

Ios 公共函数仅在从初始视图控制器调用时有效,而不是在segue之后,ios,swift,Ios,Swift,就我自己的学习而言,我正在尝试将一个关于解析json的示例项目改编成一个Xcode项目,但我遇到了一个问题,我认为这表明我严重不理解其中的一些内容 我有一个叫做DataManager的公共类。该类中包含以下函数: public class func getTopAppsFromItunesNativeParse(completion: @escaping (_ appsFromItunes: [String]) ->()) { var appsFromItunes =

就我自己的学习而言,我正在尝试将一个关于解析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)


    }

}
是的,我知道我有不完整的错误处理。我还没走那么远。此外,有效负载只是[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构造了解不够。非常感谢。