0

GCD 関数を使用して非常に大きな CSV ファイルを解析しています (以下のコードを参照してください)。

エラーが発生した場合は、キャンセルしたいと思いdispatch_io_readます。それを行う方法はありますか?

dispatch_io_read(channel,
            0,
            Int.max,
            dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0))
            { (done, data, error) in

                guard error == 0 else {
                    print("Read Error: \(error)")
                    return
                }

                if done {
                    lineBuffer.dealloc(bufferSize)
                }

                dispatch_data_apply(data)
                    { (region, offset, buffer, size) -> Bool in
                        print(size)

                        let bytes = UnsafePointer<UInt8>(buffer)

                        for var i = 0; i < size; i++ {
                            switch bytes[i] {
                            case self.cr: // ignore \r
                                break
                            case self.lf: // newline
                                lineBuffer[bufferLength] = 0x00 // Null terminated
                                line(line: String(UTF8String: lineBuffer)!)
                                bufferLength = 0
                            case _ where bufferLength < (bufferSize - 1): // Leave space for null termination
                                lineBuffer[bufferLength++] = CChar(bytes[i])
                            default:
                                return false // Overflow! I would like to stop reading the file here.
                            }
                        }

                        return true 
                }
        }
4

1 に答える 1

1

を呼び出すdispatch_io_close(DISPATCH_IO_STOP)と、実行中の操作が中断され、そのハンドラーが(部分的な結果と共に) エラーdispatch_io_readに渡されます。マンページを参照してください。ECANCELEDdispatch_io_close(3)

これは実際の I/O システム コールを中断するのではなく、追加の I/O システム コールが入力されるのを防ぐだけであることに注意してください。そのため、適切なレベルの I/O 粒度を確保するために、I/O チャネルのハイ ウォーターマークを設定する必要がある場合があります。あなたのアプリケーションのために。

于 2015-06-14T03:59:11.120 に答える