我的 Swift 3 iOS 应用程序从 LoginViewController 开始,它连接到 TabBarController,它有 3 个 ChildView,每个都是 NavigationController,它是 ViewController 的 rootView。
一个 ViewController 包含一个 Logout Button,它对 LoginViewController 执行 unwindSegue。
另一个(这个很关键)有 2 个容器视图,其中一个是 TableViewController。TableViewController 使用来自后端的数据动态填充。
当后端给我 0 数据时,一切正常。您可以按下注销按钮和每个 ViewController,以及 ContainerViews 和 TableView 正确获取 deinit()。
一旦 TableViewController 从后端获取数据并显示单元格,它就不再为 TableViewController 调用 deinit()。
原因可能是什么?我可以根据要求分享代码。
到目前为止我所做的尝试: 我尝试在存在闭包的任何地方使用无主的自我。现在我不确定这部分我使用@escaping 获取数据的位置:
func loadMyMessages()
{
let myMessagesURL = "https://www.thewebsite.com/rest/messages/mine"
self.tableView.isHidden = true
if let url = URL(string: myMessagesURL) {
self.updateFeedFilter(url, filter: self.activeFilter, hashTag: activeHashTags, completion: { [unowned self] (feed) -> Void in
self.feed?.items.removeAll()
self.feed = feed
})
}
}
func updateFeedFilter(_ url: URL, filter: String, hashTag: String, completion: @escaping (_ feed: Feed?) -> Void) {
let sid = self.prefs.string(forKey: "sid")
let headers2: HTTPHeaders = [
"lastId": "0",
"sid": sid!,
"filter": filter,
"hashTags": hashTag
]
Alamofire.request(url, method: .get, encoding: JSONEncoding.default, headers: headers2)
.responseJSON { [unowned self] response in
print(response)
guard let responseError = response.result.error else {
let feed = Feed(data: response.data!, sourceURL: url)
OperationQueue.main.addOperation({ () -> Void in
completion(feed)
self.scrollToFirstRow()
self.tableView.isHidden = false
self.delegateClicked?.stopIndicator()
})
return
}
self.showNoInternetDialog()
self.delegateClicked?.stopIndicator()
}
}
我感谢任何形式的帮助!