2016-03-30 24 views
0

バックグラウンドで連続して実行され、データをファイルに書き込む必要があるアプリがあります。時々私はファイルに書き込まれた部分的なレコードを探しているので、いくつかの追加コードを追加して、アプリがバックグラウンドであっても書き込みを完了する機会があることを保証します。バックグラウンドでiOS上のファイルにデータを書き込む方法

これまでのコードですが、動作するようですが、使用しているAPIがこのジョブに最適なAPIであるかどうかはまだ分かりません。

たとえば、ファイルを開いてそのたびにファイルの最後までシークする必要がないようにファイルを開いておく方が良いでしょうか?

iOSがタスクを完了できるようにタスクをバックグラウンドタスクとしてマークするアプローチは、1秒に1回程度実行されます。

/// We wrap this in a background task to ensure that task will complete even if the app is switched to the background 
/// by the OS 
func asyncWriteFullData(dataString: String, completion: (() -> Void)?) { 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), { 

     let taskID = self.beginBackgroundUpdateTask() 

     self.writeFullData(dataString) 

     self.endBackgroundUpdateTask(taskID) 

     if (completion != nil) { 
      completion!() 
     } 

    }) 
} 
func beginBackgroundUpdateTask() -> UIBackgroundTaskIdentifier { 
    return UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({}) 
} 

func endBackgroundUpdateTask(taskID: UIBackgroundTaskIdentifier) { 
    UIApplication.sharedApplication().endBackgroundTask(taskID) 
} 
/// Write the record out to file. If the file does not exist then 
/// create it. 
private func writeFullData(dataString: String) { 


    let filemgr = NSFileManager.defaultManager() 

    if let filePath = self.fullDataFilePath { 

    if filemgr.fileExistsAtPath(filePath) { 

     if filemgr.isWritableFileAtPath(filePath) { 

      let file: NSFileHandle? = NSFileHandle(forUpdatingAtPath: filePath) 

      if file == nil { 
       // This is a major problem so best notify the User 
       // How are we going to handle this type of error ? 
       DebugLog("File open failed for \(self.fullDataFilename)") 
       AlertManager.sendActionNotification("We have a problem scanning data, please contact support."); 

      } else { 
       let data = (dataString as 
        NSString).dataUsingEncoding(NSUTF8StringEncoding) 
       file?.seekToEndOfFile() 
       file?.writeData(data!) 
       file?.closeFile() 
      } 

     } else { 
      //print("File is read-only") 
     } 

    } else { 
     //print("File not found") 

     if createFullDataFile() { 
      // Now write the data we were asked to write 
      writeFullData(dataString) 
     } else { 
      DebugLog("Error unable to write Full Data record") 
     } 

    } 
    } 
} 
+0

writeDataToFile – nielsbot

答えて

0

NSOutputStreamを使用することをおすすめします。さらに、GCD IOはあなたの仕事を処理することもできます。

Techniques for Reading and Writing Files Without File Coordinators

+0

の原子バージョンはNSOutputStreamが開いている間のiOSやユーザーがアプリを殺す場合は、物事がうまくいく方法がありますか? iOSは開いているファイルをきれいに閉じるか、問題がないことを確認するために必要な手順はありますか? –

関連する問題