0

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()
    }
}

どんな助けにも感謝します!

4

1 に答える 1