Skip to content

Instantly share code, notes, and snippets.

@macneko-ayu
Last active November 22, 2020 06:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save macneko-ayu/113187a2f4d13db7a03f5bc4159fbfcc to your computer and use it in GitHub Desktop.
Save macneko-ayu/113187a2f4d13db7a03f5bc4159fbfcc to your computer and use it in GitHub Desktop.
A sample file loading process using swift.
import Cocoa
final class Reader {
let fileUrl: URL
var data: Data?
init(filePath: String) {
fileUrl = URL(fileURLWithPath: filePath)
}
func read() {
ElapsedTimeMeasurement.printResult(prefix: "Reader readed:") { [weak self] in
self?.data = try! Data(contentsOf: self!.fileUrl)
}
}
}
final class StreamReader: NSObject, StreamDelegate {
let maxLength: Int
let inputStream: InputStream?
var data = [UInt8]()
init(filePath: String, maxLength: Int) {
self.maxLength = maxLength
self.inputStream = InputStream(fileAtPath: filePath)
super.init()
self.inputStream?.delegate = self
}
func read() {
inputStream?.schedule(in: RunLoop.current, forMode: .default)
self.inputStream?.open()
}
func stream(_ aStream: Stream, handle eventCode: Stream.Event) {
switch eventCode {
case .openCompleted:
print("openCompleted")
case .hasBytesAvailable:
print("hasBytesAvailable")
guard let inputStream = inputStream else {
self.inputStream?.close()
return
}
var buffer = [UInt8](repeating: 0, count: maxLength)
while inputStream.hasBytesAvailable {
ElapsedTimeMeasurement.printResult(prefix: "StreamReader readed:") { [weak self] in
let result = inputStream.read(&buffer, maxLength: buffer.capacity)
if result > 0 {
self?.data.append(contentsOf: buffer.prefix(result))
print("data count: \(self!.data.count)")
}
}
}
case .errorOccurred:
print("errorOccurred")
inputStream?.close()
case .endEncountered:
print("endEncountered")
inputStream?.close()
default:
print("unknown")
inputStream?.close()
}
}
}
final class ElapsedTimeMeasurement {
static func printResult(prefix: String, action: @escaping () -> Void) {
let startDate = Date()
action()
let endData = Date()
print("\(prefix): \(endData.timeIntervalSince(startDate))")
}
}
let filePath = "/Users/macneko/Desktop/Test.ai"
let reader = Reader(filePath: filePath)
reader.read()
// 10MB
let kb = 1024 * 1024 * 10
let steramReader = StreamReader(filePath: filePath, maxLength: kb)
steramReader.read()
// result
"""
Reader readed:: 0.03912389278411865
openCompleted
hasBytesAvailable
data count: 10485760
StreamReader readed:: 0.004430055618286133
data count: 20971520
StreamReader readed:: 0.01569998264312744
data count: 31457280
StreamReader readed:: 0.008059024810791016
data count: 41943040
StreamReader readed:: 0.02678704261779785
data count: 52428800
StreamReader readed:: 0.01037299633026123
data count: 53401326
StreamReader readed:: 0.0011550188064575195
StreamReader readed:: 0.00015401840209960938
endEncountered
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment