代码之家  ›  专栏  ›  技术社区  ›  user8200389

swift 4已共享。来自其他类的URL会话?

  •  1
  • user8200389  · 技术社区  · 7 年前

    我有一个 getJSON 具有url参数的函数:

    func getJsons(jsonUrl: String) {
            guard let url = URL(string: jsonUrl) else { return }
    
            URLSession.shared.dataTask(with: url:) { (data, response, err) in
                if err != nil {
                    print("ERROR: \(err!.localizedDescription)")
                    let alertController = UIAlertController(title: "Error", message:
                        err!.localizedDescription, preferredStyle: UIAlertControllerStyle.alert)
                    alertController.addAction(UIAlertAction(title: "Dismiss", style: UIAlertActionStyle.default,handler: nil))
                    var topController:UIViewController = UIApplication.shared.keyWindow!.rootViewController!
                    while ((topController.presentedViewController) != nil) {
                        topController = topController.presentedViewController!;
                    }
                    topController.present(alertController, animated: true, completion: nil)
                }
                guard let data = data else { return }
                do {
                     let test  =  try JSONDecoder().decode([ArticleStruct].self, from: data)
    
                    DispatchQueue.main.async {
                        self.myArticles = test
                        print(self.myArticles?.count ?? 0 )
                       self.myTableView.reloadData()
                    }
    
                } catch let jsonErr {
                    print("Error:", jsonErr)
    
                }
                }.resume()    
        }
    

    现在我想将函数移到另一个类(网络类)。

    我必须如何向函数添加completionHandler,以及如何从其他类调用它。 我想将json返回给调用者类。

    我的计划:

    在主活动中->viewDidLoad:调用网络完成处理程序(getJsons(192.168.178.100/getPicture.php)) 完成时->myJsonDataMainActivity=(来自completionHandler的json数据) -&燃气轮机;主要活动。TableView。重新加载

    在其他类别中->调用网络完成处理程序(getJsons(192.168.178.100/getData.php)) 完成时->myJsonDataOtherClass=(来自completionHandler的json数据) -&燃气轮机;其他类别。TableView。重新加载

    谢谢你的帮助!

    2 回复  |  直到 7 年前
        1
  •  2
  •   Dean Huang    7 年前

    您可以使用委托。

    myJsonDataOtherClass:

    protocol NetworkDelegate {
        func didFinish(result: Data)
    }
    
    class myJsonDataOtherClass {
        var delegate: NetworkDelegate? = nil
        ...
        func getJsons(jsonUrl: String) {
            ...
            URLSession.shared.dataTask(with: url:) { (data, response, err) in
                ...        
                delegate?.didFinish(data)    
            }.resume()  
        }  
    }
    

    并在MainActivity设置委托

    class MainActivity: UIViewController, NetworkDelegate{
        ...
        let jsonClass = myJsonDataOtherClass()
        jsonClass.delegate = self
        jsonClass.getJsons(jsonUrl:url)
    
        func didFinish(result:Data) {
            // process data
        }
    }
    
        2
  •  0
  •   PoolHallJunkie    7 年前

    您应该在函数中添加一个完成处理程序,并传递JSON对象。

    func getJsons(jsonUrl: String, completion:@escaping (_ success: Bool,_ json: [String: Any]?) -> Void) {
            ...
            completion(true, json)
    }