我正在尝试使用以下代码来保留当前的本地通知列表。 NSArray明确列出了它将使用的对象类型,这意味着我不能将它与充满UILocalNotification对象的数组一起使用。但是,UILocalNotifications确实实现了NSCoding,这使我相信必须有一种简单的方法来序列化/反序列化这个对象列表。我自己需要编码和文件持久性吗?另外,有没有办法获得有关写入失败原因的更多信息?
- (NSString*)getSavedNotifsPath {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingString:@"saved_notifs.plist"];
}
- (void)prepareToHide {
UIApplication* app = [UIApplication sharedApplication];
NSArray *existingNotifications = [app scheduledLocalNotifications];
if (! [existingNotifications writeToFile:[self getSavedNotifsPath] atomically:NO] ) {
// alert
[self showSomething:@"write failed"];
}
}
答案 0 :(得分:2)
首先,更改代码
return [documentsDirectory stringByAppendingString:@"saved_notifs.plist"];
到
return [documentsDirectory stringByAppendingPathComponent:@"saved_notifs.plist"];
stringByAppendingPathComponent:将确保在文件名之前包含斜杠(/)(如果需要)。
NSArray只能保存UILocalNotification不属于的属性列表对象。相反,尝试使用NSKeyedArchiver。例如:
- (void)prepareToHide {
UIApplication* app = [UIApplication sharedApplication];
NSArray *existingNotifications = [app scheduledLocalNotifications];
NSString *path = [self getSavedNotifsPath];
BOOL success = [NSKeyedArchiver archiveRootObject:existingNotifications toFile:path];
if (! success ) {
// alert
[self showSomething:@"write failed"];
}
}
使用NSKeyedUnarchiver从保存的文件中检索数组。
注意:我实际上没有测试过这个,所以我不是100%确定它会起作用。但试试看看会发生什么。