-
[iOS] NSCoding ์ด๋? (feat. ์ธ์ฝ๋ฉ, ๋์ฝ๋ฉ, ์์นด์ด๋น)iOS/๐ Documentation 2021. 5. 23. 20:48
์๋ ํ์ธ์. ์ค๋์ ๊ณต์๋ฌธ์์์ ์ค๋ช ํ๋ NSCoding ๋ฅผ ๊ณต๋ถํด๋ณด๊ฒ ์ต๋๋ค๐ถ
NSCoding
protocol NSCoding
NSCoding์ ํด๋์ค๊ฐ encoding ๊ณผ decoding ๋๋ ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํด์ฃผ๋ ํ๋กํ ์ฝ์ ๋๋ค.
๋ค์ ๋งํ๋ฉด, NSCoding ์ ์ฑํํ ํด๋์ค๋ encoding ๊ณผ decoding ์ด ๊ฐ๋ฅํด์ง๋๋ค.
์ธ์ฝ๋ฉ์ ๊ธฐ์กด์ ํ์์ ๋ค๋ฅธ ํ์์ผ๋ก ๋ณํํ๋ ๊ฒ์ ๊ฐ๋ฆฌํต๋๋ค.
์๋ฅผ ๋ค์ด Swift ์ Struct ์ธ์คํด์ค๋ฅผ JSON ํํ์ ๋ฌธ์์ด๋ก ๋ณํ์ํค๋ ๊ฒ์ JSON Encoding ์ด๋ผ๊ณ ๋ถ๋ฅผ ์ ์์ต๋๋ค.
๋์ฝ๋ฉ์ ๊ทธ ๋ฐ๋์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ Encoding ๊ณผ Decoding ์ ์์นด์ด๋น(Archiving) ๊ณผ ๋์คํธ๋ฆฌ๋ทฐ์ (Distribution) ์ ํ์ํฉ๋๋ค.
๊ฐ์
ํ๋กํ ์ฝ์ ์๊ตฌ์ฌํญ์ด๋ฏ๋ก, NSCoding ํ๋กํ ์ฝ์ ์ด ํ๋กํ ์ฝ์ ์ฑํํ ํด๋์ค๊ฐ ๋ ๊ฐ์ง ๋ฉค๋ฒ๋ฅผ ๊ตฌํํ ๊ฒ์ ์๊ตฌํฉ๋๋ค.
Encoding ๊ณผ Decoding ์ ์์นด์ด๋น(Archiving) ๊ณผ ๋์คํธ๋ฆฌ๋ทฐ์ (Distribution)์ ๊ธฐ๋ณธ ์กฐ๊ฑด์ ๋๋ค.
์ฌ๊ธฐ์ ์์นด์ด๋น(Archiving)์ ์ค๋ธ์ ํธ๋ ์ด๋ค ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๊ฐ ๋์คํฌ์ ์ ์ฅ๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๐ก ์ข ๋ ์์ธํ, Archives๋?
์ค๋ธ์ ํธ์ ๊ฐ์ ์ํคํ ์ฒ์ ์ข ์๋์ง ์๋ ๋ฐ์ดํธ์ ์ด๋ค( stream of bytes) ๋ก ๋ณํํ ์ ์๋ ์๋จ์ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์นด์ด๋น์ ํ๋ ์ฃผ์ฒด๋ ์์นด์ด๋ฒ(Archiver) ์ ๋๋ค. NSKeyedArchiver ๋ฑ์ ์ฌ์ฉํฉ๋๋ค.
์ด ๋ ์ด ๋ฐ์ดํธ ์ด์ ์ค๋ธ์ ํธ์ ๊ฐ๋ค ์ฌ์ด์ ๊ด๊ณ์ identiy ๋ ์ ์งํ ์ํ๋ก ๋ณํ๋์ด์ผ ํฉ๋๋ค.
Cocoa archives can hold Objective-C objects, scalars, arrays, structures, and strings
์ถ์ฒ : Archives and Serializations Programming Guide
๊ทธ๋ฆฌ๊ณ ๋์คํธ๋ฆฌ๋ทฐ์ (Distribution)์ ์ค๋ธ์ ํธ๊ฐ ์ ์ ๋ ๊ณณ ๋ฐ์ ๋ค๋ฅธ ์ฃผ์ ๊ณต๊ฐ์ ๋ณต์ฌ๋๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์์นด์ด๋น๋ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ ๋ค๋ฅธ ๊ณณ์์ ๋์ฝ๋ฉํ์ฌ ์ฌ์ฉํ ์ ์์ผ๋ ์ด๋ฐ ์๋ฏธ๋ก ์ด ๊ฒ์ผ๋ก ์ดํดํ๋ค.
NSCoding ํ๋กํ ์ฝ์ ์ฑํํ๊ฒ ๋๋ฉด NSCoder ํ์ ์ coder ๊ฐ ์ค๋ธ์ ํธ์ ๋ฉ์๋ encode(with:) ์ init(coder:) ๋ฅผ ํธ์ถํฉ๋๋ค.
encode(with:) ๋ ์ค๋ธ์ ํธ๊ฐ ์์ ์๊ฒ ์ ๊ณต๋ฐ์ coder ๋ฅผ ํตํด ์ธ์คํด์ค ๋ณ์๋ฅผ ์ธ์ฝ๋ฉํ๋๋ก ์ง์ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ค๋ธ์ ํธ๋ ์ด ๋ฉ์๋๋ฅผ ์์ฐจ๋ก ์ ๋ฌ๋ฐ์ ์ ์์ต๋๋ค.
โ๏ธ"A๋ผ๋ ์ค๋ธ์ ํธ์๊ฒ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ๋ค" = "A์ ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค" ์ด๋ฏ๋ก, ์ ๋ฌธ์ฅ์ encode(with:) ๋ฉ์๋๊ฐ ์ฌ๋ฌ๋ฒ ํธ์ถ๋๋ค๋ ์๋ฏธ์ ๋๋ค.
init(coder:) ๋ ์ ๋ฌ๋ฐ์ coder ์ ๋ค์ด์๋ data (๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ) ๋ฅผ ์ด์ฉํ์ฌ ํด๋น ์ค๋ธ์ ํธ ํ์์ผ๋ก ์ด๊ธฐํํ๋๋ก ์ง์ํฉ๋๋ค.
๊ทธ๊ฒ์ ๋ค๋ฅธ ์์ฑ์๋ฅผ ๋์ฒดํ๊ณ , ํ๋์ ์ค๋ธ์ ํธ๋น ํ๋ฒ๋ง ๋ณด๋ด์ง๋๋ค.
์ด๋ค ์ค๋ธ์ ํธ ํด๋์ค๊ฐ codeable ( encoding ๊ณผ decoding์ด ๊ฐ๋ฅํ) ํ๋ ค๋ฉด ๋ฐ๋์ NSCoding ํ๋กํ ์ฝ๋ฅผ ์ฑํํ์ฌ ๊ทธ ์๊ตฌ์ฌํญ์ ๊ตฌํํด์ผํฉ๋๋ค. (์ฌ๊ธฐ์ Codable ํ๋กํ ์ฝ์ ์์ง ์๊ฐํ์ง ์๋ ๊ฒ์ผ๋ก ^^)
macOS 10.2 ์ดํ ๋ถํฐ๋ KeyedArchiving ์ ์ฃผ๋ก ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค.
Keyed archives ๋ NSKeyedArchiver ์ NSKeyedUnarchiver ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ฉ๋๋ค.
์ ๋ฆฌ
๊ฐ์ฒด๋ฅผ ์์นด์ด๋น ํ๊ณ ์ถ๋ค๋ฉด (ํ์ผ๋ก ์ ์ฅํ๊ณ ์ถ๋ค๋ฉด) NSObjcet ๋ฅผ ์์ํ๊ณ , NSCoding ํ๋กํ ์ฝ์ ๊ตฌํํ๋ฉด ๋ฉ๋๋ค.
ํ์ง๋ง ๊ตฌ์กฐ์ฒด๋ ์์นด์ด๋น ํ ์ ์์ต๋๋ค. ๊ตฌ์กฐ์ฒด์ ๊ฒฝ์ฐ Encodable ๊ณผ Decodable ํ๋กํ ์ฝ์ ์ด์ฉํฉ๋๋ค.
์์ง ์ดํด๊ฐ ํ์ํ ๋ถ๋ถ ๐ค
archivedData(withRootObject:requiringSecureCoding:)
NSKeyedArchiver ์ ํ์ ๋ฉ์๋์ธ๋ฐ, 'root of the object graph to archive' ๋ผ๋ ํํ์ด ์ดํด๊ฐ ๊ฐ์ง ์๋๋ค.
์์นด์ด๋น ๋์์ ํด๋์ค๊ฐ ์ด๋ค ํด๋์ค์ ์๋ธ ํด๋์ค์ด๋ฉด, ๊ทธ ํด๋์ค ๊ณ์ธต์ ๋ฃจํธ ํด๋์ค๋ฅผ ์ ๋ฌํ๋ผ๋ ์๋ฏธ ์ธ๊ฑด๊ฐ?
๋!
๐ค๐ข[์ฐ์งฑ์ iOS ๋ธ๋ก๊ทธ]๐ต๐ป
iOS๋ฅผ ๊ณต๋ถํ๋ฉด์ ๋ฐฐ์ด ๋ด์ฉ์ ๊ธฐ๋กํ๊ณ ์์ต๋๋ค.์ฐธ๊ณ ์๋ฃ 1: https://developer.apple.com/documentation/foundation/nscoding
'iOS > ๐ Documentation' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] CodingKey ๋? (0) 2021.05.25 [iOS] Object Graphs ์ Archives, ๊ทธ๋ฆฌ๊ณ Serialization (0) 2021.05.24 Preparing Your UI to Run in the Background - Scenes - UIKit (0) 2021.01.29 Preparing Your UI to Run in the Foreground - Scenes - UIKit (0) 2021.01.29 Scenes - UIKit (0) 2021.01.29