2011-08-20 2 views
4

메인 홈 화면이로드 될 때 백그라운드에서 동기화 업데이트를 확인하는 앱이 있습니다. 연결 속도가 느리거나 앱을 빠르게 움직이는 사용자가 있으면 이러한 요청이 여러 번 백그라운드로 쌓일 수 있습니다. 이를 방지하기 위해 BOOL 변수를 구현하여 YES 또는 NO를 토글합니다. 여러 요청이 동기화 확인을 위해 나가는 것을 방지합니다. 요청이 시작될 때NSUserDefaults를 글로벌 인스턴스 변수의 일종으로 사용하는 것은 나쁜 생각입니까?

그래서 내 코드에 다음과 같은 것이다 :이 일을 알고

NSUserDefaults *d = [NSUserDefaults standardUserDefaults]; 
NSString *key = [NSString stringWithFormat:kVarAllowSyncRequest, aManufacturerID]; 
[d setBool:NO forKey:key]; 

를하지만 내 응용 프로그램의 사용 중에 시간의 100 년대를 호출합니다 - 뭔가 내가조차 할 필요가 있다는 것입니다 걱정하지 않아?

더 나은 방법이 있습니까?

답변

3

사용자 기본값은 변경되지 않거나 세션 당 2 ~ 3 회 이상 액세스해야하는 환경 설정 및 정보를 입력하기에 좋습니다. 기본값에 액세스한다는 것은 느린 디스크를 치는 것을 의미합니다. 당신은 플래그를 여러 번 확인하는 것과 같은 것을 위해 그것을 사용하고 싶지 않습니다.

응용 프로그램 대리인은 항상 [[UIApplication sharedApplication] delegate]을 통해 액세스 할 수 있으므로 응용 프로그램의 많은 개체에 실제로 액세스 할 수 있어야하는 정보를 저장하기위한 편리한 장소이지만 해당 개체의 무게를 줄이기 전에 응용 프로그램 디자인을 신중하게 생각해야합니다 편리하기 때문에 많은 이바라 인들.

아마도 이러한 요청을 전송할 책임이있는보기 컨트롤러 일 가능성이있는 개체가 하나뿐입니다. 그것은 깃발을다는 장소 다. 당신의 설명에서, 당신은 app-global 변수가 전혀 필요없는 것처럼 들리지 않습니다. 이 플래그는 요청을 시작하는 객체에 의해서만 사용되므로 해당 객체에 대해 알아야 할 유일한 객체입니다. 플래그는 ivar 일 수 있습니다.

실제로 클래스이 있는데, 각각 요청을 보낼 많은 인스턴스가있을 수있는 경우 올바른 해결책은 인스턴스에 액세스 할 수있는 클래스 수준의 플래그를 갖는 것입니다. 이것은 간단합니다. 구현 파일에서 플래그를 보유하는 변수를 선언 : 그것은 (이 파일에 느슨하게)이 "컴파일 단위"에서 단지 볼 수 있도록 static를 선언

// RequestMaker.m 

#import "RequestMaker.h" 

static BOOL allowSyncRequest = YES; 

@implementation RequestMaker 
// etc. 

.

그런 다음이 플래그를 각각 설정하는 클래스 메소드를 생성하고 얻을 : 이제 RequestMaker 인스턴스 중 하나가 요청을 시작하고 싶어 할 때마다

+ (BOOL) allowSyncRequest { 
    return allowSyncRequest; 
} 

+ (void) setAllowSyncRequest: (BOOL)b { 
    allowSyncRequest = b; 
} 

를, 그것은 플래그를 확인해야합니다; YES 인 경우 플래그를 끄고 요청을 시작할 수 있습니다. 또한 요청이 완료되면 플래그를 재설정해야합니다.

는 (이 모두 명시 적으로 귀하의 요청에 대해 서로 다른 스레드에서 작동하지 않는 것으로 가정합니다. 당신이 입니다, 당신은 GCD queues 어쩌면 세마포어을 조사해야합니다. 당신이 경우 재미도 읽을 수 있도록 writeups by Mike Ash의 훌륭한 세트가있다 GCD를 사용하고 싶지 않다.)

0

NSUserDefaults은 일반적으로 자주 변경되지 않는 값을 유지하는 데 사용되어야에 대한 싱글을 만들 수 있습니다.

글로벌 변수에 대한 솔루션을 구현하는 가장 쉬운 방법은 응용 프로그램 위임자가 이미 사용할 수있는 싱글 톤 클래스에 속성을 추가하는 것입니다. 여기에 자주 응용 프로그램 대리자를 액세스 할 필요가 나는 일반적으로 뷰 컨트롤러에서 사용하는 코드입니다 : 앱 위임에 allowSyncRequest 속성을 가지고 가정, 그리고

// read-only property to return my app delegate 
- (MyAppDelegate*)appDelegate { 
return (MyAppDelegate*)[[UIApplication sharedApplication] delegate] ; 
} 

, 당신은 당신의 뷰 컨트롤러에서이 방법으로 액세스 할 수 있습니다 :

self.appDelegate.allowSyncRequest = NO; 
관련 문제