正在取消 dispatch_io_read
Cancelling dispatch_io_read
我正在使用 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
}
}
调用 dispatch_io_close(DISPATCH_IO_STOP)
将导致 运行 dispatch_io_read
操作被中断并且它们的处理程序被传递给 ECANCELED
错误(连同部分结果),请参阅 dispatch_io_close(3)
联机帮助页。
请注意,这不会中断实际的 I/O 系统调用,它只是阻止输入额外的 I/O 系统调用,因此您可能必须将 I/O 通道设置为高电平水印以确保您的应用程序具有适当的 I/O 粒度级别。
我正在使用 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
}
}
调用 dispatch_io_close(DISPATCH_IO_STOP)
将导致 运行 dispatch_io_read
操作被中断并且它们的处理程序被传递给 ECANCELED
错误(连同部分结果),请参阅 dispatch_io_close(3)
联机帮助页。
请注意,这不会中断实际的 I/O 系统调用,它只是阻止输入额外的 I/O 系统调用,因此您可能必须将 I/O 通道设置为高电平水印以确保您的应用程序具有适当的 I/O 粒度级别。