1

AVFoundation と AVAudioPlayerNode を使用して迅速なアプリを作成しています。再生中は再生ボタンを無効にし、プレーヤーの完了部分で有効にしますが、ボタンは 10 秒以上透明なままです。ボタンは使用可能で、私の print("complete") がすぐに表示されるため、ビューが更新されていないようです。これが私のコードです:

player.scheduleBuffer(buffer, completionHandler: {              
            print("complete")
            self.playButton.enabled = true
            }
        )

私は運がないので次のことを試しました:

self.view.layoutIfNeeded()
player.scheduleBuffer(buffer, completionHandler: {
            print("complete")
            self.playButton.enabled = true
            self.playButton.reloadInputViews()
            self.view.layoutIfNeeded()
            }
        )
4

2 に答える 2

2

これはおそらく、UI の更新を担当するメイン スレッドで完了ハンドラーが呼び出されていないためです。

完了ハンドラがメイン スレッドで実行されているかどうかを確認し、実行されていない場合は、メイン スレッドで UI の更新を担当するコードを追加します。

UI が更新されない理由をすぐに確認するには、次のコードを完了ハンドラーに配置します。

NSOperationQueue.mainQueue().addOperationWithBlock({
       print("complete")
        self.playButton.enabled = true
        self.playButton.reloadInputViews()
        self.view.layoutIfNeeded()
    })

コードがメイン スレッドで実行されているかどうかの確認は、次のように迅速に実行できます。

print(NSThread.isMainThread())

解決策を探しているときに配置したと思いますがlayoutIfNeeded、より大きなコンテキストがなければ、100%確実とは言えませんが、おそらく必要ないでしょう

于 2015-12-28T19:35:46.983 に答える
1

完了ハンドラはメイン スレッドにはありません。次のコードを使用して、コードのその部分を移動できます。

self.player.scheduleBuffer(buffer, completionHandler: {

    print("complete")

    dispatch_async(dispatch_get_main_queue(),{
    self.playButton.enabled = true
    })
})
于 2015-12-28T19:53:58.193 に答える