stopButton.isEnabled = false
print("ループの前")
for _ in 0...(startPoint) {
    sample = readerOutput.copyNextSampleBuffer()
    while reader.status != AVAssetReaderStatus.reading {
        sleep(UInt32(0.1))
    }

}
print("ループの後")

上記のようなソースですが、
ビデオファイルからサンプルバッファを取り出すループで、
ビデオの頭出しをしています。
このループの前でstopButtonを無効にしても、
ボタンが有効のままです。
ループが終了したところで無効になります。

ループの前でちゃんと無効化する方法はないでしょうか。
よろしくご教示のほどお願いします。

===========================

let avAsset = AVURLAsset(url: fileURL, options: options)
var reader: AVAssetReader! = nil
do {
    reader = try AVAssetReader(asset: avAsset)
} catch {
    #if DEBUG
    print("could not initialize reader.")
    #endif
    return
}
guard let videoTrack = avAsset.tracks(withMediaType: AVMediaType.video).last else {
    #if DEBUG
    print("could not retrieve the video track.")
    #endif
    return
}
let readerOutputSettings: [String: Any] = 
[kCVPixelBufferPixelFormatTypeKey as String : 
Int(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange)]
let readerOutput = AVAssetReaderTrackOutput(track: videoTrack, 
outputSettings: readerOutputSettings)
reader.add(readerOutput)
reader.startReading()

var sample:CMSampleBuffer!        
stopButton.isEnabled=false

for _ in 0...(startPoint) {
    sample = readerOutput.copyNextSampleBuffer()
    while reader.status != AVAssetReaderStatus.reading {
        sleep(UInt32(0.1))
    }
}

ちょっと前のコードから書いてみました。
startPoint はビデオのフレーム数で、その数値を直接設定できないか
色々と探したんですが、見つける事が出来ず、
不甲斐ないことに、そのフレーム数まで空回りさせています。

ご指摘頂いた timerange は
フレーム数の直接設定のヒントかと思い、
reader もしくは readerOutput のなかに
timerange に関する何かないか探してみましたが
上手く解決出来ませんでした。
よろしくお願いします。

dispatchQuene
でちゃんと?動いてはいます。
ですが、ループ後の処理で(そのコードは書いていませんが)
main thread でしかやってはいけないよと
warningが出ていてます。
この解決も上手くいってはいません。