美文网首页
iOS Stream的使用

iOS Stream的使用

作者: ldclll | 来源:发表于2017-03-21 11:08 被阅读619次

    当项目中需要上传大量数据至服务器的时候(例如拿到的蓝牙数据包实时上传),使用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(),以保证能依次上传文件

    相关文章

      网友评论

          本文标题:iOS Stream的使用

          本文链接:https://www.haomeiwen.com/subject/hfbwnttx.html