2016-12-19 7 views
0

& NSKeyedUnarchiver 일부 복잡한 데이터를 Core-Data에 저장하고 나중에 내 앱에서 검색하는 데 사용하고 있습니다. 이것은 지금까지 완벽하게 작동했지만 마이그레이션 후 Swift 3.0은 내 코드에 만족스럽지 않습니다. NSKeyedArchiver & NSKeyedUnarchiver/Swift 3.0

나는 일찍 내 코드에서 이것을했습니다 : 여기

 let masterArray = [firstArray, secondArray] as [Any] 
     let dataForApp:NSData = NSKeyedArchiver.archivedData(withRootObject: masterArray) as NSData 
     entityFieldsDico = ["dataForAppArray":dataForApp] 
     // Use entityFieldsDico to save dataForApp in Core-Data under the key "dataForAppArray". 

코드를 검색하는 방법은 다음과 같습니다

 var firstArray = [Int](), secondArray = [CGFloat]() 
     ....... 
     // stores some values in firstArray and also in secondArray. 
     ....... 
다음

는 데이터를 저장하는 코드가 같은 모습입니다 데이터는 다음과 같습니다 :

if let archiveData = dbRecord.value(forKey: "dataForAppArray") { 
     let archiveArray = NSKeyedUnarchiver.unarchiveObject(with: archiveData as! Data) 
     firstArray = (archiveArray as! Array)[0] as [Int] 
     secondArray = (archiveArray as! Array)[1] as [CGFloat] 
    } 

데이터를 검색하는 코드에 문제가있는 것 같습니다. 그것은 빌드시에 단순히 충돌합니다.

나는 그 두 라인을 주석 경우

 //firstArray = (archiveArray as! Array)[0] as [Int] 
     //secondArray = (archiveArray as! Array)[1] as [CGFloat] 

이 프로그램은 사용할 수 없습니다 firstArray를 &의 데이터가 (분명히)는 사실을 제외하고 작동합니다.

내가 코멘트를하지 않는다면, 아래에있는 것과 같은 것으로 끝나는 매우 긴 메시지로 끝나는 크래시가 발생합니다. (나는 메시지를 단축하기 위해 몇 가지 ... (점)를 추가합니다.)

............. 
0 swift     0x000000010d71fa3d PrintStackTraceSignalHandler(void*) + 45 
1 swift     0x000000010d71f466 SignalHandler(int) + 470 
2 libsystem_platform.dylib 0x00007fffa0c5a52a _sigtramp + 26 
3 libsystem_platform.dylib 0x0000000000000003 _sigtramp + 1597659891 
4 swift     0x000000010b25b4e3 swift::constraints::ConstraintGraphScope::~ConstraintGraphScope() + 899 
5 swift     0x000000010b2f45f4 swift::constraints::ConstraintSystem::solveSimplified(llvm::SmallVectorImpl<swift::constraints::Solution>&, swift::FreeTypeVariableBinding) + 24868 
........... 
Objects-normal/arm64/UP_ViewController.dia -emit-dependencies-path /Users/me/Library/Developer/Xcode/DerivedData/TheApp-dszaazmmftlmwbicuwcwaplkjdfs/Build/Intermediates/TheApp.build/Debug-iphoneos/TheApp.build/Objects-normal/arm64/UP_ViewController.d -emit-reference-dependencies-path /Users/me/Library/Developer/Xcode/DerivedData/TheApp-dszaazmmftlmwbicuwcwaplkjdfs/Build/Intermediates/TheApp.build/Debug-iphoneos/TheApp.build/Objects-normal/arm64/UP_ViewController.swiftdeps -o /Users/me/Library/Developer/Xcode/DerivedData/TheApp-dszaazmmftlmwbicuwcwaplkjdfs/Build/Intermediates/TheApp.build/Debug-iphoneos/TheApp.build/Objects-normal/arm64/UP_ViewController.o -embed-bitcode-marker 
1. While type-checking 'computeFunction' at /Users/me/Documents/iOS/TheApp/TheApp/UP_ViewController.swift:184:5 
2. While type-checking expression at [/Users/me/Documents/iOS/TheApp/TheApp/UP_ViewController.swift:235:17 - line:235:66] RangeText="firstArray = (archiveArray as! Array)[0] as [Int]" 

나는 사람이 이런 종류의 문제를 경험하고, 나에게 당신이 그것을 해결하는 방법을 알려 주시기 바랍니다.

+0

내 대답을 체크 아웃 –

답변

1

archiveArrayArray<Array<Any>>으로 캐스팅해야하고 Any 유형 값이 포함 된 배열 배열을 가져올 수 있습니다. 당신의 솔루션을

if let archiveData = dbRecord.value(forKey: "dataForAppArray") { 
      if let archiveArray = NSKeyedUnarchiver.unarchiveObject(with: archiveData as! Data) as? Array<Array<Any>> { 
       firstArray = archiveArray[0] as! [Int] 
       secondArray = archiveArray[1] as! [CGFloat] 
      } 

} 

이의이

var firstArray = [Int](), secondArray = [CGFloat]() 
firstArray.append(1) 
firstArray.append(1) 
firstArray.append(1) 

secondArray.append(1.1) 
secondArray.append(1.2) 
secondArray.append(1.3) 

print(firstArray) //[1, 1, 1] 
print(secondArray) //[1.1, 1.2, 1.3] 

let masterArray = [firstArray, secondArray] as [Any] //[[1, 1, 1], [1.1, 1.2, 1.3]] 
let dataForApp:NSData = NSKeyedArchiver.archivedData(withRootObject: masterArray) as NSData 

지금 Any 다음 그래서 출력을 인쇄 반환 unarchiveObject 모두 출력을 차별화 할 수 이해 타자에 대한 예를 보자입니다. 출력은

[[1, 1, 1], [1.1, 1.2, 1.3]] 

당신이 내 지점을 이해 희망이 될 것입니다

(
     (
     1, 
     1, 
     1 
    ), 
     (
     "1.1", 
     "1.2", 
     "1.3" 
    ) 
) 

이제 캐스팅 배열

if let archiveArray = NSKeyedUnarchiver.unarchiveObject(with: dataForApp as Data) as? Array<Array<Any>> { 
      print(archiveArray) 
} 

Array<Array<Any>>

let archiveArray1 = NSKeyedUnarchiver.unarchiveObject(with: dataForApp as Data) 
print(archiveArray1!) 

출력됩니다.

+0

안녕하세요, 귀하의 솔루션이 좋아 보인다. 나는 그것이 작동하도록하기 위해 노력할 필요가있다. 첫 번째 시도가 실패했습니다. 나는 너에게 계속 알려줄거야. – Michel

+0

감사합니다. Michel –

+0

첫 번째 시험판에서 어떤 문제가 있습니까? –