2013-08-13 4 views
2

내 앱에는 Appton을 통해 상태를 저장해야하는 Singleton 개체가 있습니다. 그래서 나는 어떻게 든 그것을 저장해야합니다.iOS 자동 저장된 객체

나는 두 가지 옵션 만 표시합니다. 1) 앱 종료시 저장합니다 (더하기, 어쩌면 배경으로 사용). 2) 속성이 변경 될 때마다 저장하십시오.

버그, 메모리 제한 또는 장치 전원 꺼짐 (배터리 부족) 등으로 인해 앱이 종료 될 수 있으므로 첫 번째 옵션이 좋지 않습니다. 그래서 나는 국가가 구원받지 못할 것을 기대한다.

두 번째 옵션은 각 변경 사항에 대한 수동 알림 또는 각 속성의 KVO + 관찰이 필요합니다.

내가 여기서 뭔가 잘못한 것 같습니다. 어쩌면, 당신은 나에게 약간의 조언을 줄 수 있거나 잘 알려진 패턴이있다 (나는 구글을 시도했지만 특별한 것은 없다).

UPDATE :

네, NSUserDefaults이지만, 유용성 (. 떨어지게 그냥 키 - 값 이상) 개선하기 위해 나는 랩퍼 methords를 작성합니다, 그래서 같은 문제로 끝납니다 (행 수동 코딩의).

UPDATE2 :이 삽입은 또한 코드를 좀 더 줄 필요가 + 저장소에 단 하나 명의 목적 :

CoreData도 나에게 나쁜 선택이 될 것입니다.

갱신 3은 :

은 "어떻게 저장하기"에 대한 질문이 아니다. 이것은 "자동으로 (또는 적은 코딩으로)이 저장을 호출하는 방법"에 관한 것입니다. 그래서 NSUserDefault 우리는 래퍼로 각 속성을 수동으로 구현해야합니다. NSCoding에서 save으로 전화하거나 (각기 한 곳에서 &을 캐치) 게시물을 게시하십시오.

+0

[NSUserDefaults] (http://www.icodeblog.com/2008/10/03/iphone-programming-tutorial-savingretrieving-data-using-nsuserdefaults/)를 사용할 수 있습니다. 자동으로 동기화됩니다. prefer) – Daniel

+0

NSCoding 프로토콜을 구현하여 전체 클래스를 저장할 수도 있습니다. [이 질문 (http://stackoverflow.com/questions/3000220/best-way-to-save-to-nsuserdefaults-for-custom- 클래스) – Daniel

+0

simpleBob, 질문은 저장하는 방법이 아니지만, 이러한 변경을 충분히 자주 (이상적으로 - 자동) 개체를 최신 상태로 저장하는 방법. – kpower

답변

1

iOS에서 사용자 상태를 저장하는 가장 간단한 방법은 NSUserDefaults입니다.

@interface MySingleton : NSObject 
{ 
} 

+ (MySingleton *)sharedSingleton; 

@property (copy) NSString *userName;//the variable to track 
@end 

@implementation MySingleton 
@synthesize userName; 
+ (MySingleton *)sharedSingleton 
{ 
    static MySingleton *sharedSingleton; 

    @synchronized(self) 
    { 
    if (!sharedSingleton) 
     sharedSingleton = [[MySingleton alloc] init]; 

    return sharedSingleton; 
    }  
} 

- (void)setUserName:(NSString*)userName 
{ 
    //update the variable 
    self.userName = userName; 
    //saves the new value to NSUserDefaults 
    [[NSUserDefaults standardUserDefaults] setObject:userName forKey:@"userName"]; 
    //forces instantaneous synchronization, not needed, would be updated after a periodic interval anyways 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
} 
@end 

가 선택적으로 당신은 NSCoding 프로토콜을 구현하고 NSUserDefaults에 전체 클래스를 저장, this question 좀 걸릴 수 있습니다 : 여기

은 싱글로 만든 변경된 모든 추적 예입니다.

+0

고마워,하지만 여기에 여전히 수동으로 모든 속성을 구현 - 더 나은 솔루션에 대한 희망 :) – kpower

+0

당신이 NSCoding 먼저 구현하면 @ kpower 당신도 한 번에 모든 것을 저장할 수 있습니다 – Daniel

+0

알아! 어떻게 든 자동으로 호출되도록하려면이 '저장'을 원한다. – kpower

1

첫 번째 옵션은 더 좋은 방법이라고 생각합니다. OS는 항상 메모리 경고에 대해 죽일 때 응용 프로그램에 알려줍니다. 예를 들어 didReceiveMemoryWarning 메서드는 상태를 단일 객체에 저장할 수있는 곳에서 호출됩니다. (장치 전원 꺼짐은 백그라운드로가는 것과 같기 때문에 applicationWillEnterForeground 메서드가 호출됩니다.)

+1

"iOS SDK 4 이상을 사용하여 앱을 개발하더라도 알림없이 앱이 종료 될 수 있도록 준비해야합니다." ('App Termination' : http://developer.apple.com/library/ios/DOCUMENTATION/iPhone/Conceptual/iPhoneOSProgrammingGuide/ManagementYourApplicationsFlow/ManagementYourApplicationsFlow.html#//apple_ref/doc/uid/TP40007072-CH4-SW49) – kpower