从 iCloud 文件中取消归档对象时出错
Posted
技术标签:
【中文标题】从 iCloud 文件中取消归档对象时出错【英文标题】:Error when unarchiving objects from iCloud file 【发布时间】:2015-11-30 12:52:56 【问题描述】:我有两个不同的应用程序(一个用 Objective-C 编写,一个用 Swift 编写)共享一些数据。我决定通过 iCloud 进行同步。要同步的项目被打包在一个数组中,然后保存到一个文件中。同步 Objective-C 应用程序时,一切都按预期工作,但是当我尝试在 Swift 应用程序中下载文件时出现以下错误:
由于未捕获的异常'NSInvalidUnarchiveOperationException'而终止应用程序,原因:'*** -[NSKeyedUnarchiver decodeObjectForKey:]:无法解码类(收藏夹)对象的键(NS.objects);该类可以在源代码或未链接的库中定义'
这里有两个Favourite
类:
目标 C:
@interface Favourite : NSObject
@property(retain,nonatomic) NSString* mArtikeltext;
@property(retain,nonatomic) NSString* mRid;
-(instancetype) initWithObject:(NSMutableDictionary*) object;
@end
.m:
@implementation Favourite
-(instancetype) initWithObject:(NSMutableDictionary *)object
self = [super init];
if(self)
self.mArtikeltext = [object valueForKey:@"mArtikeltext"];
self.mRid = [object valueForKey:@"mRid"];
return self;
- (void)encodeWithCoder:(NSCoder *) coder
[coder encodeObject:self.mArtikeltext forKey:@"mArtikeltext"];
[coder encodeObject:self.mRid forKey:@"mRid"];
- (id)initWithCoder:(NSCoder *)decoder
if (self = [super init])
self.mArtikeltext = (NSString *)[decoder decodeObjectForKey:@"mArtikeltext"];
self.mRid = (NSString *)[decoder decodeObjectForKey:@"mRid"];
return self;
@end
斯威夫特:
class Favourite: NSObject, NSCoding
var mArtikeltext: String = ""
var mRid: String = ""
init(object: [String: AnyObject]) throws
super.init()
guard case let (text as String, rid as String) = (object["mArtikelText"], object["mRid"]) else
throw JSONResponseError.NilResponseValue
self.mArtikeltext = text
self.mRid = rid
required init?(coder aDecoder: NSCoder)
super.init()
self.mArtikeltext = aDecoder.decodeObjectForKey("mArtikeltext") as! String
self.mRid = aDecoder.decodeObjectForKey("mRid") as! String
func encodeWithCoder(aCoder: NSCoder)
aCoder.encodeObject(self.mArtikeltext, forKey: "mArtikeltext")
aCoder.encodeObject(self.mRid, forKey: "mRid")
这就是我在 Swift 中解压缩数据的方式:
let cloudFavs: [Favourite] = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! [Favourite]
在 Objective-C 中:
NSArray *favs = [NSKeyedUnarchiver unarchiveObjectWithData:data];
任何想法如何修复错误?
【问题讨论】:
【参考方案1】:好的,经过一番挖掘,我找到了答案。我必须在 swift 类中声明 Objective-C 类名,如下所示:
@objc(Favourite)
class Favourite: NSObject, NSCoding
// and so on..
这解决了问题。
【讨论】:
以上是关于从 iCloud 文件中取消归档对象时出错的主要内容,如果未能解决你的问题,请参考以下文章
icloud归档文件夹里也缺失文件怎么办?我把iCloud关了之后然后想把文件都拖回到桌面
如何读取基于 iOS 文档的应用程序的保存位置(iCloud 或本地)的用户偏好?
使用 setUbiquitous 为 UIDocument 文件关闭 iCloud 同步时出错(LibrarianErrorDomain 错误 2)