2016-10-03 2 views
3

이 질문에 대한 답변을 찾고 있었지만 아무 것도 찾을 수 없었습니다. 유사한 질문에는 답변이 전혀 없었습니다. 기본적으로 NSKeyedUnarchiver.archiveRootObject()로 데이터를 저장하고 .unarchiveObject (withFile)로로드하려고합니다. 그것은 Swift 2.3에서 잘 작동 했었습니다. 이제는 unarchive 부분이 항상 되돌아 오지 않는다고 말하면서 충돌합니다. 또한 파일이 존재하는지 확인합니다. 나는 정말로 무슨 일이 일어나는지 전혀 모른다. 이 로딩 절차 :NSKeyedArchiver.unarchiveObject Swift 3 iOS 10

func loadnotifs(_ username:String)->[AFNotificationData]{ 
    let ArchiveURL = Constants.DocumentsDirectory.appendingPathComponent(username) 
     print("loading " + ArchiveURL.path) 
    if FileManager.default.fileExists(atPath: ArchiveURL.path) { 
     let unarchived = NSKeyedUnarchiver.unarchiveObject(withFile: ArchiveURL.path) as? [AFNotificationData] 
     if unarchived != nil { 
      return NSKeyedUnarchiver.unarchiveObject(withFile: ArchiveURL.path) as! [AFNotificationData] 
     } else { 
      return [] 
     } 
    } 
    else { 
     return [] 
    } 

} 

이는 절약입니다 :

답변

5
:
func savenotifs(_ username:String){ 
    if username != "" { 
     let ArchiveURL = Constants.DocumentsDirectory.appendingPathComponent(username) 
     print("saving " + ArchiveURL.path) 
     } 

     let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(AFDatabase.sharedDatabase.notificationList, toFile: ArchiveURL.path) 
     if !isSuccessfulSave { 
      print("Failed to save notifs") 
     } 

    } 
} 

그러나 결국 나는 항상 "예기치 않게하는 옵션 값을 풀기 동안 nil을 발견 치명적인 오류"를 얻을

나는 틀린 장소를보고 있었다. 나는 그것이 있다는 사실을주는 대신에 새로운

aDecoder.decodeBool(forKey:xxx) 

aDecoder.decodeObject(forKey:xxx) as! Bool 

을 사용했다 : 실제로 저장 및로드 절차는 괜찮 문제는이 NSCoding 프로토콜을 준수하는 데 필요한 init로 필요 잘못된 명령을 사용하여 신속한 2.3-> 3 변환기에 의해 자동으로 변경되었습니다.

또한이 명령은 swift 2.3의 부울/정수와 호환되지 않으므로주의하십시오.