[iOS] NSCoding ์ด๋? (feat. ์ธ์ฝ๋ฉ, ๋์ฝ๋ฉ, ์์นด์ด๋น)
์๋ ํ์ธ์. ์ค๋์ ๊ณต์๋ฌธ์์์ ์ค๋ช ํ๋ 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