考虑一个场景,我有一个函数“REFRESH”,这个函数被不同的方法同时调用,假设方法是“A”、“B”、“C”。如果方法“A”首先调用“REFRESH TOKEN”,那么方法“B”和“C”应该等到它完成。
我怎样才能实现这种情况?感谢您的帮助!
let serialQueue = DispatchQueue(label: "serialQueue")
var myFlag = false
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.refresh(param: 1) // Method A
self.refresh(param: 2) // Method B
self.refresh(param: 3) // Method C
}
// Method REFRESH
func refresh(param: NSInteger) -> Void {
let absolutePath = "MY SAMPLE API"
var headers: [String: String] = Dictionary<String, String>();
headers["Content-Type"] = "application/json"
serialQueue.sync {
print("\nEntered ", param)
Alamofire.request(absolutePath, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseString {
response in
switch response.result {
case .success:
print("SUCCESS")
break
case .failure(let error):
print(error)
}
}
以上代码输出:
Entered 1
Entered 2
Entered 3
SUCCESS
SUCCESS
SUCCESS
我需要这样的输出:
Entered 1
SUCCESS
Entered 2
SUCCESS
Entered 3
SUCCESS
最佳答案
您需要的是称为资源锁定 的东西。您可以使用 DispatchGroup
实现这一点。
首先您需要创建一个DispatchGroup
。在您的 Controller 中添加一个属性:
let dispatchGroup = DispatchGroup()
然后将您的refresh(param:)
函数修改为:(我已经修改了一些编码模式)
func refresh(param: NSInteger) -> Void {
// You lock your resource by entering to the dispatch group
dispatchGroup.enter()
let absolutePath = "MY SAMPLE API"
var headers = [String: String]()
headers["Content-Type"] = "application/json"
print("Entered \(param)")
Alamofire.request(absolutePath, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: headers).responseString { [weak self] (response) in
switch response.result {
case .success:
print("SUCCESS \(param)")
break
case .failure(let error):
print(error)
}
// You release the resource as soon as you get the response so that other processes may be able to use the resource
self?.dispatchGroup.leave()
}
// The lock continues by invoking the wait method
dispatchGroup.wait()
}
因此,这将用作:
方法 1
和 方法 2
请求使用相同的资源。当Method 1
正在执行时,Method 2
将等待Method 1 完成。 Method 1
完成后,Method 2
将有机会开始执行。
所以,基本上哪个方法先开始执行就会结束,然后另一个就会开始。虽然不能保证哪个会先开始执行(因为,你们不需要相互依赖)。但这将取决于您调用此方法的顺序。
关于ios - 等到多个请求被执行并且它们的完成 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49272688/