My Swift 3 iOS アプリは、3 つの ChildView を持つ TabBarController に続く LoginViewController で始まります。それぞれは、ViewController の rootView である NavigationController です。
1 つの ViewController には Logout Button が含まれており、これは LoginViewController に対して unwindSegue を実行します。
もう 1 つ (これは重要です) には 2 つのコンテナー ビューがあり、そのうちの 1 つは 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()
}
}
どんな助けにも感謝します!