swift 4来自其他课程的shared.URLS会话?

时间:2018-01-19 13:36:11

标签: swift completionhandler

我使用url参数获得了 getJSON 函数:

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返回给调用者类。

我的计划:

MainActivity中的

- > viewDidLoad:call network completionHandler(getJsons(192.168.178.100/getPicture.php))   完成后 - > myJsonDataMainActivity =(来自completionHandler的json数据)                  - > MainActivity.TableView.reload

in otherClass - > call network completionHandler(getJsons(192.168.178.100/getData.php)) 完成后 - > myJsonDataOtherClass =(来自completionHandler的json数据)                 - > otherClass.TableView.reload

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以使用委托。

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
    }
}

答案 1 :(得分:1)

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

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