Singleton Dispatch 不等待其他组
Singleton Dispatch not waiting for other groups
我正在尝试等待来自不同 classes 的所有函数完成将数据附加到数组,然后再继续。
我为 dispath 组创建了一个单例 class。当来自不同 classes 的所有组都离开时,它不会通知 result(),而是单独通知 result()。
class parralelRunner {
let dispatchGroup = DispatchGroup()
result(){
dispatchGroup.notify(queue: .main) {
print("All functions complete ")
}
}
}
class run1 {
func start(){
callAPI(){
filterresult()
}
}
callAPI(completion: (JSON)){
Alamofire.request("url", headers: headers).responseJSON { response in
if response.result.isSuccess{
completion(JSON(response.result.value!))
}else{
print("Binance - Couldn't import Request: Please check your internet connection")
}
}
}
func filterresult(){
parralelRunner.dispatchGroup.enter()
for .... {
}
parralelRunner.dispatchGroup.leave()
parralelRunner.result()
}
}
class run2 {
func start(){
callAPI(){
filterresult()
}
}
callAPI(completion: (JSON)){
Alamofire.request("url", headers: headers).responseJSON { response in
if response.result.isSuccess{
completion(JSON(response.result.value!))
}else{
print("Binance - Couldn't import Request: Please check your internet connection")
}
}
}
func filterresult(){
parralelRunner.dispatchGroup.enter()
for .... {
}
parralelRunner.dispatchGroup.leave()
parralelRunner.result()
}
}
对parralelRunner.result()
的调用只能调用一次。并且需要在每个异步进程开始时调用 enter
并在完成时相应调用 leave
。
您需要做的第一件事是将 run1
和 run2
重构为如下所示:
class run1 {
func start(){
parralelRunner.dispatchGroup.enter()
callAPI(){ JSON in
if let JSON = JSON {
filterresult()
}
parralelRunner.dispatchGroup.leave()
}
}
callAPI(completion: (JSON?)){
Alamofire.request("url", headers: headers).responseJSON { response in
if response.result.isSuccess{
completion(JSON(response.result.value!))
}else{
print("Binance - Couldn't import Request: Please check your internet connection")
completion(nil)
}
}
}
func filterresult() {
for .... {
}
}
}
然后在使用 run1
和 run2
的情况下,您需要像这样的东西:
run1.start()
run2.start()
parralelRunner.result()
我正在尝试等待来自不同 classes 的所有函数完成将数据附加到数组,然后再继续。
我为 dispath 组创建了一个单例 class。当来自不同 classes 的所有组都离开时,它不会通知 result(),而是单独通知 result()。
class parralelRunner {
let dispatchGroup = DispatchGroup()
result(){
dispatchGroup.notify(queue: .main) {
print("All functions complete ")
}
}
}
class run1 {
func start(){
callAPI(){
filterresult()
}
}
callAPI(completion: (JSON)){
Alamofire.request("url", headers: headers).responseJSON { response in
if response.result.isSuccess{
completion(JSON(response.result.value!))
}else{
print("Binance - Couldn't import Request: Please check your internet connection")
}
}
}
func filterresult(){
parralelRunner.dispatchGroup.enter()
for .... {
}
parralelRunner.dispatchGroup.leave()
parralelRunner.result()
}
}
class run2 {
func start(){
callAPI(){
filterresult()
}
}
callAPI(completion: (JSON)){
Alamofire.request("url", headers: headers).responseJSON { response in
if response.result.isSuccess{
completion(JSON(response.result.value!))
}else{
print("Binance - Couldn't import Request: Please check your internet connection")
}
}
}
func filterresult(){
parralelRunner.dispatchGroup.enter()
for .... {
}
parralelRunner.dispatchGroup.leave()
parralelRunner.result()
}
}
对parralelRunner.result()
的调用只能调用一次。并且需要在每个异步进程开始时调用 enter
并在完成时相应调用 leave
。
您需要做的第一件事是将 run1
和 run2
重构为如下所示:
class run1 {
func start(){
parralelRunner.dispatchGroup.enter()
callAPI(){ JSON in
if let JSON = JSON {
filterresult()
}
parralelRunner.dispatchGroup.leave()
}
}
callAPI(completion: (JSON?)){
Alamofire.request("url", headers: headers).responseJSON { response in
if response.result.isSuccess{
completion(JSON(response.result.value!))
}else{
print("Binance - Couldn't import Request: Please check your internet connection")
completion(nil)
}
}
}
func filterresult() {
for .... {
}
}
}
然后在使用 run1
和 run2
的情况下,您需要像这样的东西:
run1.start()
run2.start()
parralelRunner.result()