NetService.swift (数据获取封装类,结果处理协议)

创建一个数据接收类,来处理异步的网络请求。

1
2
3
4
5
6
7
8
9
10
11
12
import UIKit
import Alamofire
import SwiftyJSON

class NetService: NSObject {
func login(_ parameters: Dictionary<String, Any>) {

...

}

}

创建一个协议

1
2
3
4
protocol NetServiceProtocol{
//定义一个方法
func didRecieveDatas()
}

在数据接收类中定义一个可选代理

1
var delegate:NetServiceProtocol?

在合适的位置使用协议的方法

1
self.delegate?.didRecieveDatas()

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import UIKit
import Alamofire
import SwiftyJSON

protocol NetServiceProtocol{

func didRecieveDatas()
}

class NetService: NSObject {

var delegate:NetServiceProtocol?

func login() {

...

}

}

LoginController.swift

添加刚刚自定义的协议,并在类中初始化一个类的实例

1
2
class ViewController: UIViewController,NetServiceProtocol {
var net = NetService()

在 viewDidLoad 方法中为实例设置代理

1
2
3
4
override func viewDidLoad() {
super.viewDidLoad()
net.delegate=self
}

实现NetServiceProtocol协议的方法

1
2
3
4
5
func didRecieveDatas(){

...

}

在合适的地方使用数据接收类实例的方法

1
net.login()

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import UIKit

class LoginController: UIViewController ,NetServiceProtocol{

var net_service = NetService()

override func viewDidLoad() {
super.viewDidLoad()
net_service.delegate=self
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}

@IBAction func login(_ sender: Any) {

net_service.login()

}


func didRecieveDatas(){

...

}
}

参考:http://www.hangge.com/blog/cache/detail_712.html

等待异步通信完成

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
let group = DispatchGroup()
group.enter()

DispatchQueue.main.async {
RCIM.shared().initWithAppKey(AppServiceAPI.RY_APP_KEY)
RCIM.shared().connect(withToken: token,success: { (userId) -> Void in

...

group.leave()
}, error: { (status) -> Void in

...

group.leave()
}, tokenIncorrect: {

...

})

group.notify(queue: .main) {
self.delegate?.didRecieveDatas()
}

}

参考:https://stackoverflow.com/questions/42484281/waiting-until-the-task-finishes

如果是 Alamofire.request 中有第三方的请求,比如融云(RCIM),要把融云放进队列里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
let group = DispatchGroup()
group.enter()
Alamofire.request(AppServiceAPI.LOG_IN, method:.post, parameters: parameters).responseJSON {
response in
let json = JSON(response.result.value as Any)
print(json)
let token = json["data"]["userToken"].stringValue
DispatchQueue.main.async {
RCIM.shared().initWithAppKey(AppServiceAPI.RY_APP_KEY)
RCIM.shared().connect(withToken: token,success: { (userId) -> Void in

...

group.leave()
}, error: { (status) -> Void in

...

group.leave()
}, tokenIncorrect: {

...

group.leave()
})
group.notify(queue: .main) {
self.delegate?.didRecieveDatas()
}
}
}