Swift iOS REST 回调最佳实践
Swift iOS Best Practise REST Callback
我的 Swift iOS 应用程序与 REST Web 服务通信以检索 JSON 数据。
完成后,它将使用相应的 UITableViewController 刷新 UITableView。
为了保持整洁,我创建了一个新的 swift 文件并将请求代码放在那里。
Interface.swift
import Foundation
class WTInterface {
func login() -> Bool {
var token: String?
println("login. initializing request...")
var url = NSURL(string: "https://report.somewebservice/data.cgi")
var request = NSMutableURLRequest(URL: url!)
var session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
var params = [:]
var requestBody = [
"method" : "login",
"params" : [
"customerId": "235879840188032",
"login": "foobar",
"pass": "somepassowrd",
"language": "en"
],
"version" : "1.1"
]
var err: NSError?
request.HTTPBody = NSJSONSeri...............
视图控制器
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var wtinterface = WTInterface()
wtinterface.login()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
问题是如何最好地刷新我的 UITableView,因为这是一个异步请求。
我已经阅读了很多关于回调和关闭以及较旧的博客文章和答案,但我没有找到一个好的答案。 (主要是因为我认为这些策略现在已经过时了......)
任何人都可以指出正确的方向并粘贴一些示例代码吗?
可能对以后的某个人有用:
答案是使用闭包。
请注意 @escaping
表示闭包正在转义,即它不会 "just run through" 但可能会等待诸如网络请求之类的异步操作。请注意,在使用这些时,UI 不能在其中进行更新(因为它们不是 运行 在平均线程上),而是在主线程上为此安排一些内容。
func myClosure(callback: @escaping (_ greeting: String?) -> Void) {
print("lalalala")
// Do async request stuff here
callback("Hi there!")
}
myClosure() { aGreeting in
guard aGreeting != nil else {
return
}
print(aGreeting!)
}
我的 Swift iOS 应用程序与 REST Web 服务通信以检索 JSON 数据。 完成后,它将使用相应的 UITableViewController 刷新 UITableView。
为了保持整洁,我创建了一个新的 swift 文件并将请求代码放在那里。
Interface.swift
import Foundation
class WTInterface {
func login() -> Bool {
var token: String?
println("login. initializing request...")
var url = NSURL(string: "https://report.somewebservice/data.cgi")
var request = NSMutableURLRequest(URL: url!)
var session = NSURLSession.sharedSession()
request.HTTPMethod = "POST"
var params = [:]
var requestBody = [
"method" : "login",
"params" : [
"customerId": "235879840188032",
"login": "foobar",
"pass": "somepassowrd",
"language": "en"
],
"version" : "1.1"
]
var err: NSError?
request.HTTPBody = NSJSONSeri...............
视图控制器
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
var wtinterface = WTInterface()
wtinterface.login()
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
问题是如何最好地刷新我的 UITableView,因为这是一个异步请求。 我已经阅读了很多关于回调和关闭以及较旧的博客文章和答案,但我没有找到一个好的答案。 (主要是因为我认为这些策略现在已经过时了......)
任何人都可以指出正确的方向并粘贴一些示例代码吗?
可能对以后的某个人有用:
答案是使用闭包。
请注意 @escaping
表示闭包正在转义,即它不会 "just run through" 但可能会等待诸如网络请求之类的异步操作。请注意,在使用这些时,UI 不能在其中进行更新(因为它们不是 运行 在平均线程上),而是在主线程上为此安排一些内容。
func myClosure(callback: @escaping (_ greeting: String?) -> Void) {
print("lalalala")
// Do async request stuff here
callback("Hi there!")
}
myClosure() { aGreeting in
guard aGreeting != nil else {
return
}
print(aGreeting!)
}