2009-08-18 8 views
0

私はXMLファイルをフォーマットする文書ベースのアプリケーションを持っています。NSDocumentアーキテクチャで文書を開く前に妥当性確認

ライティングや原稿の読み取りは、私のNSDocumentのサブクラス

- (BOOL)writeToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError 
- (BOOL)readFromURL:(NSURL *)absoluteURL ofType:(NSString *)typeName error:(NSError **)outError 

で行われますが、ファイルが無効なXMLであれば、私のアプリは、単にクラッシュされます。

だから私は実装:

- (BOOL)application:(NSApplication *)theApplication openFile:(NSString *)filename 
{ 
    if(safe){open new document using .....makeDocumentWithContentsOfURL:......} 
    else{present alert} 
} 

をしかし、これで明白な副作用がたくさんあります。

-(BOOL)writeSafelyToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName  forSaveOperation:(NSSaveOperationType)saveOperation error:(NSError **)outError 
{ 
    return [self writeToURL:absoluteURL ofType:typeName error:outError]; 
    //return YES; 
} 

これはビーチボールのカーソルが表示され、最終的にアプリケーションが応答しなくなる場所です。

オープンする前に文書を検証する良い方法はありますか?

答えて

2

-readFromURL:ofType:error:は、不正なXMLでクラッシュしないように実装する必要があります。これはあなたの検証を行うべきルーチンです。あなたのコードのどの部分がクラッシュを引き起こしていますか、それはどのようなクラッシュですか?

ビーチボールについては-writeSafelyToURL:ofType:forSaveOperation:error:で、おそらく無限ループを作成しています。 -writeToURL:ofType:error:-writeSafelyToURL:....となる可能性があります。いずれにせよ、これはそれを過負荷にする非常に奇妙な方法です。ここで何を達成しようとしていますか? -application:openFile:のオーバーロードが最初の問題またはあなたが説明している過負荷にどのように関係しているかは分かりません。

+0

これは私が以前にやったことですが、悪いXMLは、アプリcreash なります - (BOOL)readFromURL:=(NSError **)outError NSXMLDocument * XMLDOC:(NSURL *)absoluteURL ofType:(NSStringの*)型名エラーを[NSXMLDocument ALLOC] initWithXMLString:文字列オプション:NSXMLNodePreserveWhitespaceエラー:&err]; (ERR) {戻り、NOであれば、 } else { 何かをする.. return YES; } } これ以上実装することは何もわかりません... –

+0

クラッシュは何ですか? –

+0

Rajesh:エラーリターンをどう扱うかはわかりません。 'xmlDoc'が' nil'であるかどうかをテストします。 * 'err'変数を調べると、' nil' *の場合のみです。また、あなたの質問にクラッシュログを編集してください。 –

1

最善の策は、あなたのアプリケーションでこれを呼んでいる:のOpenFile:方法:

[[NSDocumentController sharedDocumentController] openDocumentWithContentsOfURL:[NSURL fileURLWithPath:filename] display:YES error:&error]; 

私はすべての問題(私もドキュメントアーキテクチャに新たなんだ)を持っていなかったことを使用します。その行の前にあなたの検証をしてください。すべてがうまくいくはずです。

役に立つかもしれない別のもの:NSDocumentの異なるロード/セーブメソッドをオーバーライドする場合は、セーブ/ロードを実行しない場合は、それぞれのスーパーバージョンを最後に呼び出してください。たとえば、あるタイプのデータにはreadFromData:ofType:error:を、別のタイプにはreadFromFileWrapper:ofType:error:を設定することができます。要求されたタイプを処理しないと、それぞれの末尾に[super ...]を呼び出す限り、自動的に動作します。

+0

Whoa ...まあ、それは深刻なgravedigだったことが分かった...私は何かを探していた、これを見て、それに答えた。とにかく...誰かがそれがとにかく便利だと願ってもらいたい。 :D –

0

なぜ簡単に使用しないでくださいリターンコード ??ストレートreadFromURL:ofType:error:のためのドキュメントから

戻り値
YES文書の内容を読み取ることができれば、そうでなければNO。