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

时间:2017-03-27 19:40:55

标签: ios swift

对于我自己的学习,我正在尝试调整一个关于将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中所需的数据来实现这一点,但我真的想知道它为什么不以这种方式工作。

编辑:这个问题已得到解答。看评论。

0 个答案:

没有答案