iOS Stream的使用
2017-03-21 本文已影响619人
ldclll
当项目中需要上传大量数据至服务器的时候(例如拿到的蓝牙数据包实时上传),使用JSON上传会对服务器造成较大的压力,这时就可以考虑使用上传流文件的方式,首先定义一个写入流文件的方法
//写入流文件
func saveOutputStream() {
//判断如果文件大于指定的size
if fileSizeAtPath() > fileSize {
//保存已写好的数据的下标
saveDoneAry.append("\(fileCount)")
//文件标记+1
fileCount = fileCount + 1
//判断网络是否可用
if Reachability().connectedToNetwork() {
DispatchQueue.global().async {
//---------------------------------------
tipsLabel.text = "正在上传第\(fileCount)个文件"
//---------------------------------------
//使用文件流上传方式
Post().upload()
}
} else {
tipsLabel.text = "网络异常,暂停上传"
}
}
//HealthData为文件名,fileCount为文件的序号
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("DataFile"+"\(fileCount)")
if let outputStream = OutputStream(url: fileURL, append: true) {
//打开文件
outputStream.open()
//写入文件 *这里的data是要写入的数据,写入后会返回一个写入的字节数
let bytesWritten = outputStream.write(data!.bytes.assumingMemoryBound(to: UInt8.self), maxLength: (data?.length)!)
//判断返回的字节数大小
if bytesWritten < 0 { print("write failure") }
//关闭文件
outputStream.close()
} else {
print("Unable to open file")
}
}
通过检查文件大小的方式可以控制每一个上传文件的大小,下面是检查文件大小的方法
//检查文件大小
func fileSizeAtPath() -> Float {
let home = NSHomeDirectory() as NSString
let docPath = home.appendingPathComponent("Documents") as NSString
let filePath = docPath.appendingPathComponent("DataFile"+"\(fileCount)")
let manager = FileManager.default
var fileSize:Float = 0.0
if manager.fileExists(atPath: filePath) {
do {
if let attr: NSDictionary = try manager.attributesOfItem(atPath: filePath) as NSDictionary? {
fileSize = Float(attr.fileSize())
}
} catch {
}
}
return fileSize;
}
最后,上传的时候使用文件名"DataFile"拼接上saveDoneAry.first,当上传成功后,需要saveDoneAry.removeFirst(),以保证能依次上传文件