2

iOS6.0アプリを5.1との互換性を取り戻そうとしています。明らかなこと(自動レイアウトなど)をオフにしましたが、奇妙な段階でスタックしています。

私のアプリはXMLソースからデータを取得し、それをコアの日付構造に配置します。iOS 6では、これは完全に機能します。iOS 5では、ここでスタックします

else if (self.dataStorage.documentState == UIDocumentStateClosed) {
   NSLog(@"THIS FIRES = db on disk but closed");
   [self.dataStorage openWithCompletionHandler:^(BOOL success) {
      NSLog(@"THIS NEVER FIRES");
    }];
}

self.datastorageを見ると、それは私が期待するものです(閉じた管理ドキュメント)fileURL:file:// localhost / ..... /Library/Application%20Support/iPhone%20Simulator/5.1/Applications/E3E9192D-2DFE -4882-9041-00A1DF9E98D6 / Documents / Default%20Database documentState:[クローズ]

編集:実際にはiOS5.0または6.0以降で正常に動作します。私の問題は、純粋にiPhoneシミュレーターで実行されるiOS5.1にあります。これはシミュレーターのバグでしょうか?閉じたUIManagedDocumentを開いたり、存在しないファイルを作成したりすることはありません。

完全を期すための完全なコードは次のとおりです。

- (void)setDataStorage:(UIManagedDocument *)database
{
   if (_dataStorage != database) {
      _dataStorage = database;
      [self useDocument];
    }
}

-(UIManagedDocument*) initialiseDatabase {
  if (!self.dataStorage) {  
    NSURL *url = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    url = [url URLByAppendingPathComponent:@"DefaultDatabase"];
    self.dataStorage = [[UIManagedDocument alloc] initWithFileURL:url]; // setter will create this for us on disk
  }
  return self.dataStorage;
}
- (void)useDocument {
  if (![[NSFileManager defaultManager] fileExistsAtPath:[self.dataStorage.fileURL path]]) {
    // does not exist on disk, so create it
    NSLog(@"db not on disk");
    [self.dataStorage saveToURL:self.dataStorage.fileURL forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) {
       NSLog(@"Doesn't fire");
      }];
} else if (self.dataStorage.documentState == UIDocumentStateClosed) {
    NSLog(@"db on disk but closed");
    // exists on disk, but we need to open it
    [self.dataStorage openWithCompletionHandler:^(BOOL success) {
        NSLog(@"Doesn't fire");
    }];
} else if (self.dataStorage.documentState == UIDocumentStateNormal) {
    NSLog(@"db on disk and open");
}
}

ありがとう

4

1 に答える 1

2

今、私はもう少し詳細に問題を特定しました。多くの人々が以前にこの質問をしたようです。悲しいことに、満足のいく解決策はありませんでした。ただし、これはシミュレーターの問題/バグにすぎず、実際のデバイスでは問題にならないはずです(5.1 iPadでテストしたところ確認済みです)。

于 2013-03-03T19:32:38.167 に答える