● 옵저버 패턴 (Observer Pattern)

 - 한 객체(Subject)의 상태가 바뀌면 그 객체에 의존하는 모든 객체들(Observers)에 알린 후(Notify) 자동으로 내용이 갱신(Update)되는 방식

 - 일대다(one-to-many) 의존성을 정의함

 - MVC 패턴의 View에 해당하는 부분에서 많이 나타날 수 있음 

 - 한 객체의 상태에 대한 참조를 여러 곳에서 하고 있을 때 주로 사용 될 수 있음

 - 때문에, 한 객체의 상태에 대한 일관성이 보장됨



 UML Diagram - Observer Pattern



아주 간단한 예를 들면, (아래의 스크린 샷은 페인트히어로즈의 히어로 선택창스킬 정보창입니다.)

페인트히어로즈에서 현재 선택된 히어로(Subject)가 무엇인지에 따라


이를 의존하고 있던 스킬 정보창의 UI 요소들(Observers - 스킬 이름, 스킬 설명, 스킬 레벨, 스킬 아이콘 등...)이

자동으로 현재 선택된 히어로에 대한 내용으로 갱신되어 유저에게 보여지는 것도 Observer Pattern이 사용될 수 있습니다.




- Source Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// Subject.cs
using System.Collections.Generic;
 
public class Subject 
{
    private List<Observer> observerList = new List<Observer>();
 
    public void Attach (Observer o)
    {
        observerList.Add(o);
    }
 
    public void Notify ()
    {
        foreach (Observer o in observerList)
        {
            o.Update();
        }
    }
}
 
 
// SbjHero.cs
public class SbjHero : Subject
{
    private string _heroName;
    private string _heroSkillName;
 
    public string heroName
    {
        get { return _heroName; }
        set { _heroName = value; }
    }
 
    public string heroSkillName
    {
        get { return _heroSkillName; }
        set { _heroSkillName = value; }
    }
}
 
 
// Observer.cs
public abstract class Observer
{
    public abstract void Update ();
}
 
 
// ObsHeroName.cs
using UnityEngine;
 
public class ObsHeroName : Observer 
{
    private SbjHero sbjHero;
 
    public ObsHeroName (SbjHero sbj)
    {
        sbjHero = sbj;
    }
 
    public override void Update ()
    {
        Debug.Log("current hero name : " + sbjHero.heroName);
    }
}
 
 
// ObsHeroSkill.cs
using UnityEngine;
 
public class ObsHeroSkill : Observer 
{
    private SbjHero sbjHero;
 
    public ObsHeroSkill (SbjHero sbj)
    {
        sbjHero = sbj;
    }
 
    public override void Update ()
    {
        Debug.Log("current hero skill name : " + sbjHero.heroSkillName);
    }
}
 
 
// Game.cs
using UnityEngine;
using System.Collections;
 
public class Game : MonoBehaviour 
{
    void Start ()
    {
        SbjHero h = new SbjHero();
 
        h.Attach(new ObsHeroName(h));
        h.Attach(new ObsHeroSkill(h));
 
        // change subject state and notify observers
        h.heroName = "Lucian";
        h.heroSkillName = "Charging Shot";
        h.Notify();
 
        // result
        // current hero name : Lucian
        // current hero skill name : Charging Shot
    }
}
cs


유니티 프로젝트를 XCode로 빌드하고 app을 Run 했을 때


Terminating app due to uncaught exception 'NSUnknownKeyException' 


와 같은 에러와 함께 app이 멈추는 현상이 발생한다면,


XCode에서 UnityViewControllerBase를 검색.




UnityViewControllerBaseiOS.mm 에서


NSAssert(UnityShouldAutorotate(), @"UnityDefaultViewController should be used only if unity is set to autorotate");


이 부분을 주석처리하세요.



그 이후엔 문제없이 잘 돌아갔습니다.




유니티 프로젝트를 XCode로 빌드 시


엄청난 로그와 함께


ld: library not found for -lPods-Unity-iPhone

clang: error: linker command failed with exit code 1 (use -v to see invocation)


이런 에러가 발생한다면,


Unity-iPhone과

Pods의




Build Settings -> Architectures 의 모든 항목들이 일치하는지 확인해보시기 바랍니다.



저 같은 경우에는 Pods의 Architectures -> Architectures 항목이 서로 다르게 설정되어있었는데

일치시키고 다시 시도하니 빌드 성공했습니다.


매우 간단한 문제였는데 너무 오래 헤맸네요.



XCode에서 iOS App을 Archive 후 Upload to App Store 할 때,


(ERROR ITMS-90023: "Missing required icon file. The bundle does not contain an app icon for iPad of exactly '167x167' pixels, in .png format .")


이와 같은 에러로 인해 업로드 실패하는 경우가 생긴다면


해결 방법!




저기 iPad Pro App iOS 9 83.5pt 부분이 비어있을텐데

167x167 짜리 App Icon을 하나 만드셔서 저 부분에 드래그 & 드랍 해주시면 됩니다!



최근에 Apple에서 출시한 iPad Pro 때문에 생긴 문제같네요.





XCode로 디바이스에 Build & Run 시에


process launch failed: failed to get the task for process 915


와 같은 에러가 발생한다면


Project -> Build Settings -> Code Signing -> Code Signing Identify -> Release 항목을


Developer 용으로 변경하면 해결됩니다.



+ Recent posts