我正在尝试将NSKeyedArchiver生成的NSData转换为NSString,以便我可以传递它并最终将其转换回NSData.我必须将其作为字符串传递(我使用的是三次传递URL).我已经经历了各种编码,UTF8,ASCII等,并且无法获得任何工作.NSKeyedArchiver说NSData被格式化为属性列表:NSPropertyListBinaryFormat_v1_0.
有没有人知道如何将这个NSData转换为String并再次返回?字符串的大小不是问题.
谢谢
这是我的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的参数是archivedDataWithRootObject:应该是我要保存的数组,还是转换为NSData的数组?
cocoa-touch objective-c nsmutablearray nskeyedarchiver nsdata
iOS文档区分"序列化"和"归档".这是一般性的区别(即,在其他语言中保存)还是特定于Objective-C?另外,这两者有什么区别?
我有一个CLLocation数据库,我想存档.该NSUserDefaults系统应该使用吗?否则,如何最好地存档CLLocation数据?
我希望这与我在这里使用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计数方法: …
我不明白为什么我可以归档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) 我正在尝试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) 我在使用时遇到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) 在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 ×10
objective-c ×4
ios ×3
archiving ×2
cocoa ×2
nsdata ×2
cllocation ×1
cocoa-touch ×1
codable ×1
iphone ×1
nscoder ×1
nscoding ×1
nsstring ×1
swift ×1
swift3 ×1
swift4 ×1