swift 4 shared.URLS 来自其他 class 的会话?
swift 4 shared.URLS Session from other class?
我得到了一个 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()
}
现在我想将该功能移动到另一个 class(网络 class)。
我必须做什么才能将 completionHandler 添加到该函数以及如何从其他 classes 调用它。
我想 return 将 json 转给来电者 class。
我的计划:
在 MainActivity -> viewDidLoad: 调用网络 completionHandler(getJsons(192.168.178.100/getPicture.php))
完成时 -> myJsonDataMainActivity =(json 来自 completionHandler 的数据)
-> MainActivity.TableView.reload
在otherClass -> 调用网络completionHandler(getJsons(192.168.178.100/getData.php))
完成时 -> myJsonDataOtherClass = (json 来自 completionHandler 的数据)
-> otherClass.TableView.reload
感谢您的帮助!
您可以使用委托。
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
}
}
您应该在函数中添加完成处理程序并传递 JSON 对象。
func getJsons(jsonUrl: String, completion:@escaping (_ success: Bool,_ json: [String: Any]?) -> Void) {
...
completion(true, json)
}
我得到了一个 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()
}
现在我想将该功能移动到另一个 class(网络 class)。
我必须做什么才能将 completionHandler 添加到该函数以及如何从其他 classes 调用它。 我想 return 将 json 转给来电者 class。
我的计划:
在 MainActivity -> viewDidLoad: 调用网络 completionHandler(getJsons(192.168.178.100/getPicture.php)) 完成时 -> myJsonDataMainActivity =(json 来自 completionHandler 的数据) -> MainActivity.TableView.reload
在otherClass -> 调用网络completionHandler(getJsons(192.168.178.100/getData.php)) 完成时 -> myJsonDataOtherClass = (json 来自 completionHandler 的数据) -> otherClass.TableView.reload
感谢您的帮助!
您可以使用委托。
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
}
}
您应该在函数中添加完成处理程序并传递 JSON 对象。
func getJsons(jsonUrl: String, completion:@escaping (_ success: Bool,_ json: [String: Any]?) -> Void) {
...
completion(true, json)
}