2016-08-01 17 views
2

私はセンサーからBluetoothを使用してデータを取得しています。ファイルの最後にデータの文字列を追加したいと思います。私はファイルに書き込む効率的な方法

if let dir = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true).first { 
     let path = NSURL(fileURLWithPath: dir).URLByAppendingPathComponent(self.file) 

     do { 
      try text.writeToURL(path, atomically: false, encoding: NSUTF8StringEncoding) 
     } 
     catch {/* error handling here */} 

定期的なアプローチを試みたとき

は私のアプリでも、ラベルはもう更新されませんでしたまで減速し始めました。

dispatch_asyncを使ってみましたが、バックグラウンドスレッドでやってみましたが、それでもアプリが減速していました。

どのようなアプローチをとるべきですか?私はストリームについてsthを読んでいましたが、すぐに頼りにできる解決策を見つけることに失敗しました

+0

を求めることができた場合は、なぜあなたはすべてのコンテンツを読んでいます各書き込みのファイルの?あなたはファイルの末尾に書き込むことができます – redent84

+0

私はそれをどうすればいいのか具体例を秘密にすることができたらうれしいです – DCDC

+0

あなたはこのライブラリを試してみてください。もっと簡単にする:https://github.com/nvzqz/FileKit – MCMatan

答えて

3

あなたのファイル操作を実行しているよりも速くデータを読み込んでいます。各書き込み操作ですべてのコンテンツを読み込むのではなく、ファイルにテキストを追加して最適化することができます。書き込みの間にファイルハンドラを再利用し、ファイルを開いたままにすることもできます。その後、あなたは、単一のストリーマを作成して、別の書き込みでそれを再利用することができ

struct MyStreamer: OutputStreamType { 
    lazy var fileHandle: NSFileHandle? = { 
     let fileHandle = NSFileHandle(forWritingAtPath: self.logPath) 
     return fileHandle 
    }() 

    lazy var logPath: String = { 
     let path : NSString = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.AllDomainsMask, true).first! 
     let filePath = (path as NSString).stringByAppendingPathComponent("log.txt") 

     if !NSFileManager.defaultManager().fileExistsAtPath(filePath) { 
      NSFileManager.defaultManager().createFileAtPath(filePath, contents: nil, attributes: nil) 
     } 
     print(filePath) 
     return filePath 

    }() 

    mutating func write(string: String) { 
     print(fileHandle) 
     fileHandle?.seekToEndOfFile() 
     fileHandle?.writeData(string.dataUsingEncoding(NSUTF8StringEncoding)!) 
    } 
} 

このサンプルはthis answerから抽出された

var myStream = MyStreamer() 
myStream.write("First of all") 
myStream.write("Then after") 
myStream.write("And, finally") 

この場合、あなたはボーナスを持っているMyStreamerことOutputStreamTypeであるため、次のように使用できます。

var myStream = MyStreamer() 
print("First of all", toStream: &myStream) 
print("Then after", toStream: &myStream) 
print("And, finally", toStream: &myStream) 

は最後に、私は、インスタンス変数に文字列「LOG.TXT」を移動することをお勧めいたしますと、コンストラクタのパラメータとして渡したい:the Apple Docsでファイルハンドラについて

var myStream = MyStreamer("log.txt") 

詳細情報を。

+0

ありがとう、後でそれをチェックし、あなたに結果を得る! :) – DCDC

+0

素晴らしい、ありがとう! – DCDC

0

は次のようにファイルを書き込もう..

var paths: [AnyObject] = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) 
let filePath = paths[0].stringByAppendingString("/filename.mov") 

do 
    { 
    try NSFileManager.defaultManager().removeItemAtURL(outputURL) 
    } 
catch 
    { 

      error as NSError 
    } 

do { 
    try text.writeToURL(path, atomically: false, encoding: NSUTF8StringEncoding) 
    } 

私はあなたが最初に削除する必要があり、最後に言うことを意味..任意のクエリはあなたが私に

関連する問題