标签: nskeyedarchiver

NSData从NSKeyedArchiver到NSString

我正在尝试将NSKeyedArchiver生成的NSData转换为NSString,以便我可以传递它并最终将其转换回NSData.我必须将其作为字符串传递(我使用的是三次传递URL).我已经经历了各种编码,UTF8,ASCII等,并且无法获得任何工作.NSKeyedArchiver说NSData被格式化为属性列表:NSPropertyListBinaryFormat_v1_0.

有没有人知道如何将这个NSData转换为String并再次返回?字符串的大小不是问题.

谢谢

cocoa objective-c nsstring nskeyedarchiver nsdata

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

NSKeyedArchiver不归档我的Codable类

这是我的Codable类:

class SensorOutput: Codable {

    var timeStamp: Date?

    var gyroX: Double?
    var gyroY: Double?
    var gyroZ: Double?

    var accX: Double?
    var accY: Double?
    var accZ: Double?

    var magX: Double?
    var magY: Double?
    var magZ: Double?

    init() {}
}
Run Code Online (Sandbox Code Playgroud)

在这里,我尝试编写并读取该类的对象以进行归档:

    let myData = SensorOutput()
    myData.timeStamp = Date()
    myData.gyroX = 0.0
    myData.gyroY = 0.0
    myData.gyroZ = 0.0
    myData.accX = 0.0
    myData.accY = 0.0
    myData.accZ = 0.0
    myData.magX = 0.0
    myData.magY = 0.0
    myData.magZ = 0.0

    NSKeyedArchiver.archiveRootObject(myData, toFile: filePath)

    if let Data = …
Run Code Online (Sandbox Code Playgroud)

nskeyedarchiver ios swift4 codable

7
推荐指数
2
解决办法
2824
查看次数

NSKeyedArchiver archivedDataWithRootObject:

NSKeyedArchiver的参数是archivedDataWithRootObject:应该是我要保存的数组,还是转换为NSData的数组?

cocoa-touch objective-c nsmutablearray nskeyedarchiver nsdata

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

序列化与存档?

iOS文档区分"序列化"和"归档".这是一般性的区别(即,在其他语言中保存)还是特定于Objective-C?另外,这两者有什么区别?

serialization archiving nskeyedarchiver

6
推荐指数
2
解决办法
2624
查看次数

需要归档CLLocation数据

我有一个CLLocation数据库,我想存档.该NSUserDefaults系统应该使用吗?否则,如何最好地存档CLLocation数据?

iphone nsuserdefaults nskeyedarchiver cllocation

6
推荐指数
2
解决办法
5526
查看次数

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万
查看次数

NSKeyedArchiver失败了CLLocationCoordinate2D结构.为什么?

我不明白为什么我可以归档CGPoint结构而不是CLLocationCoordinate2D结构.归档者有什么不同?

平台是iOS.我正在模拟器中运行,并没有尝试过该设备.

// why does this work:
NSMutableArray *points = [[[NSMutableArray alloc] init] autorelease];
CGPoint p = CGPointMake(10, 11);
[points addObject:[NSValue valueWithBytes: &p objCType: @encode(CGPoint)]];
[NSKeyedArchiver archiveRootObject:points toFile: @"/Volumes/Macintosh HD 2/points.bin" ];

// and this doesnt work:
NSMutableArray *coords = [[[NSMutableArray alloc] init] autorelease];
CLLocationCoordinate2D c = CLLocationCoordinate2DMake(121, 41);
[coords addObject:[NSValue valueWithBytes: &c objCType: @encode(CLLocationCoordinate2D)]];
[NSKeyedArchiver archiveRootObject:coords toFile: @"/Volumes/Macintosh HD 2/coords.bin" ];
Run Code Online (Sandbox Code Playgroud)

我在第二次崩溃archiveRootObject,这条消息被打印到控制台:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSKeyedArchiver …
Run Code Online (Sandbox Code Playgroud)

objective-c nskeyedarchiver ios

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

NSKeyedUnarchiver无法解析swift中的自定义对象

我正在尝试NSCodingswift中协议的基本实现,但似乎我无法成功地在对象被正确存档后取消归档.

这是我的尝试

import Cocoa

class User: NSObject, NSCoding {
    var name: String

    init(name: String) {
        self.name = name
    }

    init(coder aDecoder: NSCoder!) {
        self.name = aDecoder.decodeObjectForKey("name") as String
    }

    func encodeWithCoder(aCoder: NSCoder!) {
        aCoder.encodeObject(name, forKey: "name")
    }
}

let user = User(name: "Gabriele")
let encodedUser = NSKeyedArchiver.archivedDataWithRootObject(user)
let decodedUser = NSKeyedUnarchiver.unarchiveObjectWithData(encodedUser) as User
Run Code Online (Sandbox Code Playgroud)

在操场上运行它,它会在最后一行启动一个例外.这是细节

Execution was interrupted, reason: signal SIGABRT.
The process has been left at the point where it was interrupted, use "thread return -x" to return …
Run Code Online (Sandbox Code Playgroud)

nscoding nskeyedarchiver nskeyedunarchiver swift

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

NSKeyedArchiver - 无法识别的选择器发送到实例错误

我在使用时遇到unrecognized selector sent to instance错误NSKeyedArchiver.archivedData

我试图将解析的 JSON 输出存储到自定义类对象中,并NSUserDefaults在成功登录时将其存储在其中。我想在其他控制器中使用这些详细信息来进行其他POST调用。但是,当将它们保存在我的中时,LoginController我收到此错误。有人可以帮助解决这个问题吗?

我的课:

class UserDetails : NSObject,NSCoding {


    var token:String?
    var agentId: Int?
    var userId:Int?


    //to directly get values from JSON output

    init?(user: [String: Any]) {

        guard let token = user["token"] as? String,
            let agentId = user["agent_id"] as? Int,
            let userId = user["user_id"] as? Int
        else{
            return nil
        }


                self.token = token;
                self.agentId = agentId;
                self.userId = userId;
        }

    init(pToken:String,pAgentId:Int,pUserId:Int)
    {
        token = pToken; …
Run Code Online (Sandbox Code Playgroud)

nsuserdefaults nskeyedarchiver ios swift3

6
推荐指数
2
解决办法
7829
查看次数

如何在iOS 12中替换NSKeyedArchiver的初始化程序init(forWritingWith :)来编码CKRecord的元数据

在iOS 12中,不推荐使用NSKeyedArchiver的初始化程序init(forWritingWith :).Xcode 10建议用新的初始化程序init(需要SecureCoding :)替换它.问题是此初始化程序仅设置NSCoder对象的requiresSecureCoding属性的值,但它不设置将包含编码数据的NSMutableData对象.以下是Apple提出的编码CKRecord元数据(CloudKit记录)的原始代码:

let data = NSMutableData()
let coder = NSKeyedArchiver.init(forWritingWith: data)
coder.requiresSecureCoding = true
record.encodeSystemFields(with: coder)
coder.finishEncoding()
Run Code Online (Sandbox Code Playgroud)

CKRecord类的encodeSystemFields方法需要NSKeyedArchiver对象(NSCoder子类),并且编码数据存储在与此对象关联的NSMutableData对象中.如果我用init(requiresSecureCoding :)初始化程序替换init(forWritingWith :)初始化程序,我得到一个NSKeyedArchiver对象,但是这个对象没有与任何NSMutableData对象关联,因此我没有得到记录的元数据.我不确定如何完成代码以将NSKeyedArchiver对象生成的数据转换为NSMutableData对象.

nskeyedarchiver nscoder

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