尝试关闭UIDocument时防止崩溃
问题描述:
我想知道如何在尝试关闭UIDoc两次时防止崩溃。我试图确定在我的代码中,你(理论上)不能关闭UIDocument两次。但是,它有时会发生,我不知道为什么。如果是这样,应用程序崩溃:尝试关闭UIDocument时防止崩溃
2012-07-06 15:24:34.470 Meernotes[11620:707] ... doc state:Normal
2012-07-06 15:24:34.472 Meernotes[11620:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'closeWithCompletionHandler called while document is already closing'
*** First throw call stack:
(0x3720e88f 0x34f13259 0x3720e789 0x3720e7ab 0x312681d1 0xd19db 0x96f7f 0x9593f 0xacb8f 0x30f0cd23 0x37a7f933 0x371e2a33 0x371e2699 0x371e126f 0x371644a5 0x3716436d 0x33923439 0x30f10cd5 0x94fdd 0x94f78)
terminate called throwing an exception(lldb)
我试图防止死机如下,但它没有任何作用(即它仍然会崩溃):
-(void)closeDoc {
UIDocumentState state = _selectedDocument.documentState;
NSMutableArray * states = [NSMutableArray array];
if (state == 0) {
[states addObject:@"Normal"];
}
if (state & UIDocumentStateClosed) {
[states addObject:@"Closed"];
}
if (state & UIDocumentStateInConflict) {
[states addObject:@"In conflict"];
}
if (state & UIDocumentStateSavingError) {
[states addObject:@"Saving error"];
}
if (state & UIDocumentStateEditingDisabled) {
[states addObject:@"Editing disabled"];
}
NSLog(@"... doc state: %@", [states componentsJoinedByString:@", "]);
if (_selectedDocument.documentState & UIDocumentStateClosed) return;
[_selectedDocument closeWithCompletionHandler:^(BOOL success) {
NSLog(@"Closed document.");
// Check status
if (!success) {
NSLog(@"Failed to close %@", _selectedDocument.fileURL);
} else {
_selectedDocument = nil;
}
}];
}
答
它看起来像UIDocument
没有按不存储关闭状态,只有正常和关闭,所以你必须自己动手。
添加到您的类变量:
BOOL _documentClosing;
,并添加您的closeDoc
方法及其用途:
-(void)closeDoc {
if (_docClosing || (_selectedDocument.documentState & UIDocumentClosed) != 0)
return;
_docClosing = YES;
[_selectedDocument closeWithCompletionHandler:^(BOOL success) {
NSLog(@"Closed document.");
// Check status
if (!success) {
NSLog(@"Failed to close %@", _selectedDocument.fileURL);
} else {
_selectedDocument = nil;
_docClosing = NO;
}
}];
}
答
要知道,每个UIDocument对象只能打开和关闭一次,这是非常重要的。在实现这个之前,我在UIDocuments中遇到了很多奇怪的问题,无论是在云端还是在本地文件中。关闭文档时,将其指针设置为零,因此无法再将其关闭。如果您稍后需要再次访问相同的文件,请使用相同的fileURL创建一个新的UIDocument。
上面显示的错误消息是您尝试重新使用文档时出现的错误消息。
非常感谢。我完全忽略了这个收盘与收盘不一样。 iCloud API仍然远非完美... – 2012-07-06 14:46:16