tableViewでセルを選択すると、その行を再読み込みするだけでなく、特定の日付にAVAudioPlayersを起動するタイマーをセットアップする必要があります(この設定には数秒かかります。すでに意図したとおりに)。テーブルビューで行を再読み込みすると誤って遅くなる
ただし、テーブルビューの行を再ロードすると(行が効果的に強調表示されます)、しばらくの間遅れます。
優れたUI体験を維持するために、最初のものとしてリロードする行が必要です。ここで示唆したように、私は、メインスレッドでリロード一部を入れてみました
:UITableView reloadData() gets fired but delays
これは、何らかの理由で動作しません。
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// do some things
dispatch_async(dispatch_get_main_queue(), {
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None)
})
setupTimersToFireAtDate()
}
func setupTimersToFireAtDate() {
let start = NSDate()
// These are Float as they will be calculated with other Float values
var accumulatedTime: Float = 0.0
var elapsedTime: Float = 0.0
for event in events {
var player = AVAudioPlayer()
accumulatedTime += event.time
do {
// the urls array keeps urls to the sounds. For this example, I've set the index to be random, since it doesn't really matter.
player = try AVAudioPlayer(contentsOfURL: urls[Int.random])
// Players need to be maintained in order to playback, each player is removed with the audioPlayerDidFinishPlaying AVAudioPlayerDelegate method.
players += [player]
} catch let error as NSError {
loadError = error
}
elapsedTime = Float(NSDate().timeIntervalSinceDate(start))
// Some other calculations in between here.
player.prepareToPlay()
player.delegate = self
player.currentTime = 0.0
player.playAtTime(player.deviceCurrentTime + (NSTimeInterval(accumulatedNoteTime - elapsedTime)))
}
}
は、私はここで何かが欠けていることがあり、なぜこれが動作していないのかわからないからです。
ご迷惑をおかけして申し訳ありません。
「setupTimersToFireAtDate」で質問を更新してください。そのコードはすべてメインスレッド上で実行されているので、 'reloadRowsAtIndexPaths'の呼び出しは' setupTimersToFireAtDate'が完了するまで実行されません。 – rmaddy
こんにちはrmaddy、ご意見ありがとうございます。私はコードを更新しましたが、私は関連する部分にそのメソッドを削除しました。あなたが言ったように、これらはメインスレッド上にあり、プレーヤーのタイミングは非常に重要ですが、私は最初に更新する行が必要です、ユーザーは選択された行のハイライトを見るために2秒待つべきではありません。 – nontomatic