Last active
November 22, 2020 06:55
-
-
Save macneko-ayu/113187a2f4d13db7a03f5bc4159fbfcc to your computer and use it in GitHub Desktop.
A sample file loading process using swift.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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