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(),以保证能依次上传文件

上一篇下一篇

猜你喜欢

热点阅读