小编Gre*_*ner的帖子

NSKeyedArchiver和NSKeyedUnarchiver与NSMutableArray

我希望这与我在这里使用Mutable数组的事实无关,但是这个让我感到困惑,所以如果是这样的话我也不会感到惊讶.

背景:

我创建了一个小型数据库,它本质上是一个包含自定义对象的NSMutableArray,我们可以将其命名为recordObjects.我设置了数组:

database = [[NSMutableArray alloc] init];
Run Code Online (Sandbox Code Playgroud)

我的自定义对象,名为"recordObject",包含以下变量和inits:

NSString *name;
int       anInt;
Bool      aBool;
Run Code Online (Sandbox Code Playgroud)

我也合成了方法,所以我可以拨打电话:

aString = [[database objectAtIndex:someIndex] name];
Run Code Online (Sandbox Code Playgroud)

并添加了我的控制器类的方法来添加,删除和选择要显示的各个记录.到目前为止,一切都正常,完全符合预期.

接下来,我设置了我的recordObject类(NSObject的子类)来使用NSCoder(通过包含在@interface指令中,并在实现文件中添加了以下自定义编码器和解码器方法:

-(void) encodeWithCoder: (NSCoder *) encoder {
    [encoder encodeObject: name  forKey: @"recordName"];
    [encoder encodeInt:    anInt forKey: @"recordInteger"];
    [encoder encodeBool:   aBool forKey: @"recordBool"];
}

-(id) initWithCoder: (NSCoder *) decoder {
    name    = [decoder decodeObjectForKey: @"recordName"];
    anInt   = [decoder decodeIntForKey:    @"recordInteger"];
    aBool   = [decoder decodeBoolForKey:   @"recordBool"];
}
Run Code Online (Sandbox Code Playgroud)

为了编写文件,我使用了以下内容:

[NSKeyedArchiver archiveRootObject:database toFile:myPath];
Run Code Online (Sandbox Code Playgroud)

当我运行程序时,所有内容都可以正常运行.为阵列中的每个记录调用编码器方法,并将文件写入磁盘.使用TextEdit打开文件会显示数据存在(虽然对我来说几乎无法理解).

问题:

这是我陷入困境的地方.

我添加了以下代码来将文件加载到我的数据库数组中:

database = [NSKeyedUnarchiver unarchiveObjectWithFile:myPath];
Run Code Online (Sandbox Code Playgroud)

当我再次运行程序时,这次加载数据库,它的外观正常工作.我的第一个测试是使用NSMutableArray计数方法: …

cocoa objective-c archiving nsmutablearray nskeyedarchiver

6
推荐指数
1
解决办法
1万
查看次数

编码NSMutableArray

我有一个包含各种NSString对象和变量的对象,我将这些对象和NSCoding归档到磁盘上的文件中,然后取消归档.到目前为止,一切都运作良好.

今天,我想在对象中添加一个NSMutableArray并尝试使用以下代码进行编码:

[encoder encodeObject:myArray ForKey:@"myArray"];
Run Code Online (Sandbox Code Playgroud)

然后使用以下方法解码它:

[self setMyArray:[decoder decodeObjectForKey:@"myArray"]];
Run Code Online (Sandbox Code Playgroud)

它似乎没有工作,虽然我没有在编码或解码本身中得到任何错误,但如果我尝试在从文件解码后修改数组的值,我会收到错误.

我确定我在这里做了一些完全错误的事情,但并不完全确定是什么.我想也许它可能与它没有在unarchive期间正确分配有关.

什么看起来明显是问题的根源?

xcode nscoding nsmutablearray

4
推荐指数
1
解决办法
4163
查看次数

安全范围内的书签-书签可解决,但仍无法访问文件

编辑:在底部添加的其他信息

我有一个基于文档的沙盒应用程序,该程序将用户选择的QuickTime影片加载到AVPlayer中,并且一切运行正常。

现在,我正在升级代码,以便它将使用Security Scoped书签来获取URL,而不仅仅是存储URL字符串,以便持久存储将允许在重新启动应用程序时加载影片。创建书签后,它将存储在托管对象的Data变量中。

由于某些原因,这破坏了AVPlayer。虽然我已经从用户选择的URL创建了书签,并且可以在重新启动应用程序时从书签中解析URL,但是电影无法正确地加载到AVPlayer中,我不知道为什么...我已经确认从书签解析的URL确实指向电影文件。

我还为项目添加了适当的权利。

这是我的代码:

用户选择要加载的电影并创建书签的功能

 @IBAction func loadMovie(_ sender: Any) {

    let openPanel = NSOpenPanel()
    openPanel.title = "Select Video File To Import"
    openPanel.allowedFileTypes = ["mov", "avi", "mp4"]

    openPanel.begin { (result: NSApplication.ModalResponse) -> Void in
        if result == NSApplication.ModalResponse.OK {

            self.movieURL = openPanel.url
            self.player = AVPlayer.init(url: self.movieURL!)

            self.setupMovie()

            if self.loadedMovieDatabase.count > 0 {
                print("Movie Object Exists. Adding URL String")
                self.loadedMovieDatabase[0].urlString = String(describing: self.movieURL!)
            } else {
                print("No Movie Object Exists Yet.  Creating one and adding URL String")
                let …
Run Code Online (Sandbox Code Playgroud)

avplayer security-scoped-bookmarks swift

1
推荐指数
1
解决办法
922
查看次数