KVC/KVO ๋Š” Apple Framework์—์„œ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•œ๋‹ค. ํ•œ๋ฒˆ ๊ณต๋ถ€ํ•ด๋ณด์ž.

Background

03. Operation Queue์—์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ์•„๋ณด์•˜๋˜ ์ ์ด ์žˆ๋‹ค.

์ผ๋‹จ ์™œ ์ด ๊ฐœ๋…์ด ๋‚˜์™”๋Š”์ง€์— ๋Œ€ํ•ด์„œ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Objective C๊ฐ€ ํ•„์š”ํ•˜๋‹ค. MVC ํŒจํ„ด์ด ์ตœ๊ณ ๋ผ๊ณ  ์—ฌ๊ฒจ์งˆ ์‹œ๊ธฐ.. Controller์˜ ์—ญํ• ์€ Model๊ณผ View์˜ Sync๋ฅผ ๋งž์ถ”๋Š” ๊ฒƒ์ด์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์—์„œ Controller๊ฐ€ ํ•ด์•ผํ•˜๋Š” ์ผ์€ ๋‘๊ฐ€์ง€์ด๋‹ค.

  1. Model์˜ ๋ณ€ํ™”๋ฅผ View์— ๋ฐ˜์˜ํ•œ๋‹ค.
  2. View์˜ Interaction์„ ๋ฐ”ํƒ•์œผ๋กœ Model์— ๋ฐ˜์˜ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ณผ์ •์— ์žˆ์–ด์„œ ์ƒํƒœ๊ฐ’์„ ๊ฒฐ๊ตญ ๋™๊ธฐํ™”ํ•ด์ฃผ๋Š” ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๊ฒŒ ๋œ๋‹ค. Action์ด ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค ์ด๋ฅผ ์ผ์ผํžˆ ์—…๋ฐ์ดํŠธํ•ด์ฃผ๊ธฐ ๋ณด๋‹ค๋Š” ๋ฌถ์–ด์„œ ์„œ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ํ•ด๋‘๋ฉด ํŽธํ•˜์ง€ ์•Š์„๊นŒ? ์ด๋Ÿฌํ•œ ์ ์—์„œ Objective C ์‹œ์ ˆ ๋‚˜์˜จ ๊ฐœ๋…์ด๋ผ๊ณ  ์ดํ•ดํ•˜๋ฉด ๋œ๋‹ค.

Key Value Coding

๋ฌธ์ž์—ด ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ์ฒด์˜ ํ”„๋กœํผํ‹ฐ์— ๊ฐ„์ ‘์ ์œผ๋กœ ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜

์œ„์˜ ๋ฌธ์ œ ๋ฐฐ๊ฒฝ์œผ๋กœ ๋ถ€ํ„ฐ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ฒซ๋ฒˆ์งธ ๊ฐœ๋…์ด ๋“ฑ์žฅํ•œ๋‹ค.

KVC๋Š” NSKeyValueCoding์ด๋ผ๋Š” protocol์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด protocol์€ ์ ‘๊ทผ์ž getter์™€ setter๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ด protocol์—์„œ ์ œ๊ณตํ•˜๋Š” setter๋ฅผ ์‚ฌ์šฉํ•ด์•ผ, observer๋“ค์—๊ฒŒ ๊ฐ’์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.(KVO์™€ ์—ฐ๊ฒฐ)

  • getter Method
    • valueForKey:
    • valueForKeyPath
  • setter Method
    • setValue:forKey:
    • setValue:forKeyPath

Key๋กœ ๋“ค์–ด๊ฐ€๋Š” ๋…€์„๋“ค์€ ํŠน์ • ๊ทœ์น™์ด ์žˆ๋‹ค.

  • ASCII Encoding์ด์–ด์•ผ ํ•œ๋‹ค.
  • ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•œ๋‹ค.
  • ๊ณต๋ฐฑ์ด ์—†์–ด์•ผ ํ•œ๋‹ค.
id address = [person valueForKey:@"address"];
id town = [address valueForKey:@"town"];

Key๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฐ์ฒด์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ์˜ˆ์ œ์ด๋‹ค. ๋ณด๋ฉด ๊ฐ์ฒด์˜ property์— ์ง์ ‘ ์ ‘๊ทผ(ObjectInstance.property)ํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ž์—ด์„ ํ†ตํ•ด์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

id town = [person valueForKeyPath:@"address.town"];

๋‹ค์Œ์€ KeyPath๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ์ด๋‹ค. ์ฐจ์ด์ ์„ ์•Œ๊ฒ ๋Š”๊ฐ€? ์ธ์Šคํ„ด์Šค์— ์ง์ ‘ ์ ‘๊ทผํ•˜์ง€ ์•Š๊ณ , .์„ ํฌํ•จํ•œ ๋ฌธ์ž์—ด์„ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ property๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์žˆ๋‹ค.

Key Value Observing

๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ํŠน์ • ํ”„๋กœํผํ‹ฐ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•Œ๋ฆผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜

KVO๋Š” KVC๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๊ณ  ์žˆ๋‹ค. ์ฆ‰, ํŠน์ • ๊ฐ’์„ ๊ด€์ฐฐํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ KVC๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ Observingํ•  ์ˆ˜ ์žˆ๋Š”์ง€, removeํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋งŒ ์•Œ๋ฉด ๋œ๋‹ค.

[self addObserver:self
       forKeyPath:@"someView.frame"
          options:0
          context:NULL];

์œ„์˜ ์˜ˆ๋Š” ํŠน์ • View์˜ frame ๊ฐ’์„ observing ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ ์–ด๋‘” ๊ฒƒ์ด๋‹ค. KeyPath๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ’์„ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋‹ค.

[self removeObserver:self forKeyPath:@"someView.frame"];

์‚ฌ์šฉ์ด ๋๋‚œ ์‹œ๊ธฐ์— ์ง€์›Œ์ฃผ๋Š” ๊ฒƒ๋„ ์žŠ์ง€ ๋ง์•„์•ผ ๊ฒ ๋‹ค.

Reference