我的应用程序(Swift 5,Xcode 10,iOS 12)从ftp服务器下载了几个文件,并将它们保存在设备上的“ Documents”文件夹中(已通过仿真器测试)并读取它们。如果没有互联网连接(通过简单地拔下Mac Mini的跳线进行测试),我的应用程序将读取现有文件。
正在登录服务器,正在读取文件,...我的应用程序显示UIAlertController
(无按钮):
private func setUpProgressIndicator() {
//Created on the main thread
indicator = UIActivityIndicatorView(style: UIActivityIndicatorView.Style.gray)
indicator.frame = CGRect(x: 0.0, y: 0.0, width: 40.0, height: 40.0)
indicator.center = view.center
view.addSubview(indicator)
indicator.bringSubviewToFront(view)
UIApplication.shared.isNetworkActivityIndicatorVisible = true
indicator.startAnimating()
alertMessage = "- Logging in"
alert = UIAlertController(title: "Please wait", message: alertMessage, preferredStyle: UIAlertController.Style.alert)
self.present(alert, animated: true, completion: nil)
}
通过NavigationController
(UIViewController
1-> UIViewController
2)执行搜寻:
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
print("prepare 1->2a")
let navVC = segue.destination as? UINavigationController
let tableVC = navVC?.viewControllers.first as! ViewController2
print("prepare 1->2b")
tableVC.importedData = importedData!
print("prepare 1->2c")
}
如果连接了跳线,这将正常工作-我唯一一次检查互联网连接的时间就是UIViewController
1的开头,因为VC2并不依赖于此。如果未插入,它仍会显示“ prepare 1-> 2c”,但不会加载第二个View,而是仅显示一条错误消息(该应用不会崩溃!):
2019-05-20 14:36:23.572160+0200 myapp[2635:59029] <UIView: 0x7fa232715a50;
frame = (0 0; 320 568); autoresize = W+H;
layer = <CALayer: 0x60000079fb80>>'s window is not equal to
<UIAlertController: 0x7fa23282aa00>'s view's window!
我尝试添加
alert.dismiss(animated: true, completion: nil)
indicator.stopAnimating()
到prepare()
,但这并不能解决问题。
如果我不使用setUpProgressIndicator()
,则说服功能正常-即使没有互联网连接。
我还有别的事情来适当地解散UIAlertDialog
吗?为何通过互联网连接就可以正常工作,但如果没有互联网连接就不能正常工作?
编辑:
我一直无法找出为什么会抛出此错误,但是我突然发现了为什么突然这样做了。直到昨天,我仍使用FTP库的功能来检查Internet连接:
ftpProvider?.isReachable(completionHandler: { (success, error) in
if !success {
readExistingFiles() //calls "prepare"
}
})
这将检查单独线程中的连接,因此,也从单独线程中调用prepare
,该线程当然会显示“ [UIView setAnimationsEnabled:]正在从后台线程中调用”警告。尽管如此,它仍然成功执行了segue。
上面的func会返回“ false”,所以我将其交换为Reachability库,该库不会像这样检查自己的线程:
if reachability.connection != .none {}
...这也意味着我的整个代码正在同步运行,而如果有Internet连接,它将使用FTP库的额外线程来下载新文件,等等。因此,当我执行此操作时,只会抛出上述错误消息正在执行主线程上的所有操作,这也阻止了segue以某种方式执行。此操作(也从UI线程调用)无论如何都不起作用:
DispatchQueue.main.async {
self.readExistingFiles()
}
尽管如此,我仍然不明白“ ...窗口不等于...”错误消息,也不知道为什么会这样。