ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 210425 - TIL
    TIL/2021 2021. 4. 26. 01:22

    PropertyList

     

    • xml로 만들어져 있다.
      • OpenAS - sourceCode로 보면 xml로 보인다,
    • Key와 Value를 한 쌍으로 
    • new에서 PropertyList를 생성해 새로 추가할 수 도 있다.
    • 하나의 Root에 data들을 추가를 시켜야 한다.
    • 저장한 data는 Bundle에 추가된다.
      • Bundle에 추가되는 data들은 읽기 전용이다.
      • NSDictionary나 NSArray로 저장된 data를 읽어올 수 있다.
    • FileManager로 File에 추가하고 불러올 때 decoder는 PropertyListDecoder()를 사용하면 된다.
    • 저장할 때는 PropertyListEncoder()를 사용하면 된다.
    • Codable 채용한 형식으로도 encode, decode 할 있다.

     


    Class, Struct를 file로 저장하고 불러오기

     

    NSCoding

    • Protocol
    • 객체를 file로 저장할 때에는 NSKeyedArchiver를 이용하고 archiveRootObject(_:toFile:) 메서드를 호출하여 객체
      • 이때 NSCoding프로토콜을 채용한 형식 이어야 한다.
      • encode에서는 파라미터로 제공되는 aCoder를 이용하여 key, value를 전달하면 된다.
      • docode에서도 마찬가지로 aDecoder를 이용하면 된다.
        • 이때 decodeObject(forKey:) 메서드의 return이 Any이기 때문에 typecasting이 필요하다.
      • 그리고 NsObject도 상속을 해야 한다.
        • 안 하면 crash 발생 
    • 단점은 struct를 저장하지 못한다.
      • 왜냐면 NSObject를 상속해야 하니까!
    • 그럼 struct는??
      • Decodable, Encodable을 채용하면 된다.

     

    • File을 읽을 때는 NSKeyedUnarchiver를 이용하고 unarchiveObject(with:) 메서드를 이용한다.
      • 마찬가지로 Any이기 때문에 typeCasting 해야 한다.

     

    • 보안 문제를 해결하기 위해 NSSecureCoding이 생겼다.
    • NSSecureCoding 프로토콜을 채용시키고 required 하나만 override 해준다.
      • decodeObject를 사용하면 형식을 정해서 보낼 수 있다.
        • 근데 이 메서드에 첫 번째 파라미터로는 struct를 보낼 수 없다. 
      • encode도 archivedData(withRootObject:requiringSecureCoding:)으로 해야 한다.
    • Decode 할 때는 unarchiveObject(with:)  대신 unarchivedObject(ofClass:from:)을 사용한다.
      • root 에러가 난다고 뜰 수 있는데
      • 이건 struct를 전달해서 그럴 수 있다, class로만 보내야 하기 때문에 String -> NSString, Int -> NSNumber로 바꿔야 한다.

     

     

    Codable

    • Encodable & Decodable이다,
    • NSCoding, NSSecureCoding은 class 만 가능했다.
    • struct도 가능해야지!
    • init은 자동으로 제공된다.
    • 기본형식들은 Codable을 채용하고 있고 모든 속성들이 Codable을 채용하고 있다면 멤버 구현을 생략할 수 있다.
    • iOS 11.0 이상에서는 NSKeyedArchiver 속성을 이용한다.
    • 그 이하라면 인스턴스를 생성한다.
    • 꼭 encoding이 끝나면 finishEncoding()을 호출해야 한다
    • Decoding는  NSKeyedUnarchiver를 사용한다.
    • Class Struct 모두 가능하다
    728x90

    'TIL > 2021' 카테고리의 다른 글

    210427 - TIL  (0) 2021.04.28
    210426 - TIL  (0) 2021.04.28
    210422 - TIL  (0) 2021.04.23
    210421 - TIL  (0) 2021.04.22
    210419 - TIL  (0) 2021.04.20
Designed by Tistory.