如何判断UITableView何时完成重新加载

时间:2017-03-14 15:01:51

标签: ios swift uitableview

调用tableView.reloadData()似乎在另一个线程上启动重新加载。如果我立即尝试选择我添加到我的数据结构中的单元格,它可能还没有被TableView重新加载。有没有办法告诉TableView何时完成reloadData()过程。我的实际代码是:

nobil@DESKTOP-VCON7T6 MINGW64 /c/Program Files/Java/jdk1.8.0_121/jre/lib/security
$ keytool -importcert -trustcacerts -alias ALIASNAME -file C:/Users/nobil/OneDrive/Documenti/mycompany/test/52708968.crt -keystore C:/Program Files/Java/jdk1.8.0_121/jre/lib/securitycacerts -storepass changeit
Opzione non valida:  Files/Java/jdk1.8.0_121/jre/lib/securitycacerts
keytool -importcert [OPTION]...

Importa un certificato o una catena di certificati

Opzioni:

 -noprompt                       non richiedere
 -trustcacerts                   considera sicuri i certificati da cacerts
 -protected                      password mediante meccanismo protetto
 -alias <alias>                  nome alias della voce da elaborare
 -file <filename>                nome file di input
 -keypass <arg>                  password chiave
 -keystore <keystore>            nome keystore
 -storepass <arg>                password keystore
 -storetype <storetype>          tipo keystore
 -providername <providername>    nome provider
 -providerclass <providerclass>  nome classe provider
 -providerarg <arg>              argomento provider
 -providerpath <pathlist>        classpath provider
 -v                              output descrittivo

Utilizzare "keytool -help" per visualizzare tutti i comandi disponibili

其中selectNode是我的函数,用于定位显示该节点的TableViewCell。它经常失败,因为TableView还没有重新显示它。我可以通过插入一个等待循环来“强制”一个解决方案,该循环检查TableView是否在重新加载后请求了我的所有行,但我希望有一个更优雅的解决方案。我对一般的等待循环也感到不舒服。

1 个答案:

答案 0 :(得分:0)

我想分享我发现的问题的解决方案,以及它对tableView.reloadData如何工作的含义。首先,这是我最终到达的代码:

func addNewItem() {
    // here we create the kind of item the user chose

    //ending with this 
    tableView.reloadData()
    queueCheckForDone()
}

func queueCheckForDone() {
    DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + .milliseconds(1), execute: {
        self.checkForDone()
    })
}

func checkForDone() {
    if items[items.count-1].viewCell != nil {     // has last view cell been created
        self.selectItem(item: addedItem)
    } else {
        queueCheckForDone()
    }
}

问题是在reloadData之后,我希望选择刚刚添加的单元格。但是,调用后不会立即出现,因为tableView尚未完成加载。 reloadData想要在主线程上运行,而我的代码,一个事件处理程序,通过在主线程上阻止它。一旦我放弃线程等待,甚至一毫秒,reloadData抓住线程并重新加载整个表(> 250ms)。当我终于再次获得控制权时,我正在寻找的单元格始终存在,所以我从未执行checkForDone测试的else子句。