Avatar
Avatar
hironytic
NSFileHandleのエラーについてお伺いしたいです(SwiftのFileHandleも同じとは思いますが、Objective-Cで書かれた古いコードに起因する部分なので、正確性を期すためにObjective-CのAPIで質問します)。 iPad向けアプリで、ある程度大きなデータ量になることがあるローカルにあるバイナリファイルを部分的に読み書きするために、 -seekToOffset:error:-seekToEndReturningOffset:error: でシークしたあと、 -readDataUpToLength:error: (以下「read API」)や -writeData:error: (以下「write API」)を使っています。頻度は低いものの、read APIやwrite APIがエラーになることを確認しています。 read APIは 「Error Domain=NSCocoaErrorDomain Code=257 "ファイルを表示するためのアクセス権がないため、開けませんでした。" UserInfo={NSUnderlyingError=0x280241b30 {Error Domain=NSPOSIXErrorDomain Code=1 "Operation not permitted"}}」というエラーが出たのを確認していますが、ファイルは存在し、同じインスタンスでその手前までread APIの呼び出しが何度も成功した後に起こっているので、アクセス権がないということはないと思います。 write APIは、処理ロジックと作られたデータからの分析ですが、同一インスタンスで28590回成功後、387回失敗、1回成功、1失敗、63406回成功となった形跡があります。 何かエラーになる条件が分かれば、そのタイミングでは処理を避けるといったことを検討したいのですが、エラーになる条件として考えられるものがあれば教えていただきたいです。また、エラー発生時のリカバリについて例えばリトライしてみるというのは回復の可能性があるでしょうか。特にwrite APIの方は一部だけ失敗するとデータ破損を招くので頭を抱えています。 あと、エラーを返さない旧API( -readDataOfLength:-writeData: )と挙動の違いはあるのでしょうか。どうも新APIに置き換えた頃からデータ破損報告が見られるようになった感もあり…(たまたまかもしれません)。 (edited)
hironytic さん 詳細にご説明ありがとうございます。拝見している限りですと、何かの特定の別な処理が動いている時などに事象が起きるのかなという感じがいたしますが、処理についの状況をしっかりと把握した上で、書き込み時の失敗を防ぐための確実な方法という意味ですと、弊社のコードレベルのサポートにご相談いただくのが一番かと思います。お手数ですが、下記のコードレベルのサポートのご利用をご検討いただけますでしょうか?よろしくお願いします。 https://developer.apple.com/jp/support/technical/
🙇‍♂️ 1