사용자 기본값은 변경되지 않거나 세션 당 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를 사용하고 싶지 않다.)