У меня есть следующий код, используемый для получения пути к объекту, который был заархивирован
let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let path = paths[0] as String
let archivePath = path.stringByAppendingString("archivePath")
Когда я запускаю этот код, он падает при вызове NSSearchPathForDirectoriesInDomains
с отображением lldb
Thread 1: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
В представлении переменных Xcode я вижу набор строк пути, как и ожидал. Как правильно получить пользовательский каталог в Swift для архивирования/разархивирования объектов?
Обновление:
Похоже, это на самом деле происходит сбой при использовании NSKeyedUnarchiver:
stopwatches = NSKeyedUnarchiver.unarchiveObjectWithFile(archivePath) as Stopwatch []
Секундомер — это класс, который реализует NSCoding, секундомеры — это источник данных (массив секундомеров), принадлежащий представлению, выполняющему разархивирование.
Обновление 2:
Архивируемый граф объектов представляет собой массив секундомеров. NSCoding реализован следующим образом:
func encodeWithCoder(aCoder: NSCoder!) {
aCoder.encodeBool(self.started, forKey: "started")
aCoder.encodeBool(self.paused, forKey: "paused")
aCoder.encodeObject(self.startTime, forKey: "startTime")
aCoder.encodeObject(self.pauseTime, forKey: "pauseTime")
aCoder.encodeInteger(self.id, forKey: "id")
}
init(coder aDecoder: NSCoder!) {
self.started = aDecoder.decodeBoolForKey("started")
self.paused = aDecoder.decodeBoolForKey("paused")
self.startTime = aDecoder.decodeObjectForKey("startTime") as NSDate
self.pauseTime = aDecoder.decodeObjectForKey("pauseTime") as NSDate
self.id = aDecoder.decodeIntegerForKey("id")
super.init()
}
Обновление 3: если для параметра expandTilde
задано значение true, мой путь будет /Users/Justin/Library/Developer/CoreSimulator/Devices/FF808CCD-709F-408D-9416-EE47B306309D/data/Containers/Data/Application/B39CCB84-F335-4B70-B732-5C3C26B4F6AC/Documents/ArchivePath
Если я установлю expandTilde
в false, у меня не будет сбоя, но файл не будет заархивирован и разархивирован, а путь будет @"~/Documents/ArchivePath"
Удаление папки приложения приводит к тому, что первый запуск приложения не приводит к сбою, но не позволяет повторно открыть его впоследствии. Кроме того, после удаления папки приложения я теперь могу прочитать путь к архиву в lldb, а не печатать его.
archivePath
передается? - person Jack   schedule 03.07.2014/Users/Justin/Library/Developer/CoreSimulator/Devices/FF808CCD-709F-408D-9416-EE47B306309D/data/Containers/Data/Application/B39CCB84-F335-4B70-B732-5C3C26B4F6AC/Documents/ArchivePath
, но если я пытаюсь напечатать описание с помощью lldb, я получаюPrinting description of ArchivePath: (String) ArchivePath = <variable not available>
- person JuJoDi   schedule 03.07.2014Stopwatch[]
? Или этоNSArray
? - person Jack   schedule 03.07.2014NSKeyedArchiver.archiveRootObject(self.stopwatches, toFile: ArchivePath)
, аself.stopwatches
определяется в классе какvar stopwatches: Stopwatch []
- person JuJoDi   schedule 03.07.2014NSString
вместоString
? - person user102008   schedule 03.07.2014super.init()
в своем методе инициализации? - person user102008   schedule 03.07.2014class Stopwatch: NSObject, NSCoding {
- person JuJoDi   schedule 03.07.2014stopwatches
всего лишьStopwatch[]
? - person Matt Gibson   schedule 05.07.2014