2016-10-03 14 views
0

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

は、私はここで何かが欠けていることがあり、なぜこれが動作していないのかわからないからです。

ご迷惑をおかけして申し訳ありません。

+0

「setupTimersToFireAtDate」で質問を更新してください。そのコードはすべてメインスレッド上で実行されているので、 'reloadRowsAtIndexPaths'の呼び出しは' setupTimersToFireAtDate'が完了するまで実行されません。 – rmaddy

+0

こんにちはrmaddy、ご意見ありがとうございます。私はコードを更新しましたが、私は関連する部分にそのメソッドを削除しました。あなたが言ったように、これらはメインスレッド上にあり、プレーヤーのタイミングは非常に重要ですが、私は最初に更新する行が必要です、ユーザーは選択された行のハイライトを見るために2秒待つべきではありません。 – nontomatic

答えて

1

最も簡単な解決策は、setupTimersToFireDateへのコールを遅らせ、reloadRowsAtIndexPathsへのコールがすぐに実行できるようにすることです。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    // do some things 

    tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .None) 

    dispatch_async(dispatch_get_main_queue(), { 
     setupTimersToFireAtDate() 
    }) 
} 
+0

私は喜んで最も簡単な解決策をとるでしょう!それは素晴らしい、ありがとう、rmaddyたくさん働く。私はそれの間違った部分を派遣しました。 – nontomatic

関連する問題