在 swift 中实现加载微调器
Implementation of a loading spinner in swift
我正在尝试在我的应用程序首次从关闭状态启动时进行一些网络调用时显示加载微调器。这些网络调用通常需要很短的时间,因为它们是 json 字符串上的 GET 并对其进行了一些处理,但如果它们花费的时间比平时长,我不希望我的用户试图在应用程序中进行操作没有他们需要的数据。因此,我试图在进行这些调用时显示一个微调器。但是微调器永远不会出现。在我更改了很多东西之前,我已经可以正常工作了,但现在它又不能正常工作了,我这辈子都想不通为什么。
这是我的 HomeViewController 中的 viewDidLoad() 方法,其中此信息是从 API 中提取并加载到 CoreData 中的。
override func viewDidLoad() {
super.viewDidLoad()
self.showSpinner(onView: self.view)
let teamsByConferenceNetworkManager = TeamsByConferenceNetworkManager()
teamsByConferenceNetworkManager.getTeamsByConference(completion: { (data, error) in
guard let data = data else {
os_log("Could not unwrap teamsByConference data in LoginViewController.viewDidLoad()", type: .debug)
self.removeSpinner()
let _ = UIAlertAction(title: "Network unavailable", style: .cancel, handler: { (alert) in
alert.isEnabled = true
})
return
}
let dataModelManager = DataModelManager.shared
DispatchQueue.main.sync {
dataModelManager.loadTeamNamesByConference(teamNamesByConferenceName: data)
dataModelManager.loadGamesFromCoreData()
}
if let _ = dataModelManager.allGames {
self.removeSpinner()
return
} else {
let gamesNetworkManager = GamesNetworkManager()
gamesNetworkManager.getGames { (data, error) in
guard let data = data else {
os_log("Could not unwrap games data in LoginViewController.viewDidLoad()", type: .debug)
self.removeSpinner()
let _ = UIAlertAction(title: "Network unavailable", style: .cancel, handler: { (alert) in
alert.isEnabled = true
})
return
}
DispatchQueue.main.sync {
dataModelManager.loadGames(gameApiResponses: data)
}
}
}
})
self.removeSpinner()
}
你需要删除这个
DispatchQueue.main.sync {
dataModelManager.loadGames(gameApiResponses: data)
}
}
}
})
self.removeSpinner(). <<<<<< this line
}
因为调用是异步的,您在使用 self.showSpinner(onView: self.view)
添加微调器后直接将其删除
我正在尝试在我的应用程序首次从关闭状态启动时进行一些网络调用时显示加载微调器。这些网络调用通常需要很短的时间,因为它们是 json 字符串上的 GET 并对其进行了一些处理,但如果它们花费的时间比平时长,我不希望我的用户试图在应用程序中进行操作没有他们需要的数据。因此,我试图在进行这些调用时显示一个微调器。但是微调器永远不会出现。在我更改了很多东西之前,我已经可以正常工作了,但现在它又不能正常工作了,我这辈子都想不通为什么。
这是我的 HomeViewController 中的 viewDidLoad() 方法,其中此信息是从 API 中提取并加载到 CoreData 中的。
override func viewDidLoad() {
super.viewDidLoad()
self.showSpinner(onView: self.view)
let teamsByConferenceNetworkManager = TeamsByConferenceNetworkManager()
teamsByConferenceNetworkManager.getTeamsByConference(completion: { (data, error) in
guard let data = data else {
os_log("Could not unwrap teamsByConference data in LoginViewController.viewDidLoad()", type: .debug)
self.removeSpinner()
let _ = UIAlertAction(title: "Network unavailable", style: .cancel, handler: { (alert) in
alert.isEnabled = true
})
return
}
let dataModelManager = DataModelManager.shared
DispatchQueue.main.sync {
dataModelManager.loadTeamNamesByConference(teamNamesByConferenceName: data)
dataModelManager.loadGamesFromCoreData()
}
if let _ = dataModelManager.allGames {
self.removeSpinner()
return
} else {
let gamesNetworkManager = GamesNetworkManager()
gamesNetworkManager.getGames { (data, error) in
guard let data = data else {
os_log("Could not unwrap games data in LoginViewController.viewDidLoad()", type: .debug)
self.removeSpinner()
let _ = UIAlertAction(title: "Network unavailable", style: .cancel, handler: { (alert) in
alert.isEnabled = true
})
return
}
DispatchQueue.main.sync {
dataModelManager.loadGames(gameApiResponses: data)
}
}
}
})
self.removeSpinner()
}
你需要删除这个
DispatchQueue.main.sync {
dataModelManager.loadGames(gameApiResponses: data)
}
}
}
})
self.removeSpinner(). <<<<<< this line
}
因为调用是异步的,您在使用 self.showSpinner(onView: self.view)