2013-03-19 5 views
0

이상하게 들릴 수도 있습니다."다시 초기화하십시오"sharedInstance

시나리오

구현 AFOauthClient

나는 서브 클래스를 만들어 내 base을 함께 공유 인스턴스를 생성하고 완벽하게 모든

+ (GYMAFOAuthClient *)sharedClient { 
    static GYMAFOAuthClient *_sharedClient = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 

     NSURL *url =[NSURL URLWithString:[[NSUserDefaults standardUserDefaults] stringForKey:@"kServer_Address"]]; 
     if (url==nil) { 
      [[[UIAlertView alloc]initWithTitle:@"Required" message:@"Please enter the required fields in the settings page of the application" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]show]; 
     } 
     else 
     { 
      _sharedClient = [GYMAFOAuthClient clientWithBaseURL:url clientID:kClientID secret:kClientSecret]; 
     }  
    }); 
    return _sharedClient; 
} 

로 작동합니다.

그러나

는 지금은 다른 서버로 전환 할 필요가 있고 난 dispatch_once 방법의 재 초기화를 사용하고 같은 것은 trouble.How 내가 새로운 URL을 지정하고 새와 base을 내 공유 인스턴스를 만들 수있다 url.

내가 뭘하려 : 나는 지금 단지 클라이언트를 작성하고 내가 그것을 달성 할 수 responses.How을 받기 시작해야 할 내 사용자 기본 설정에서 URL을 목적으로 설정 번들을 사용하고

?

명확한 설명 :

변경 서버가 ... 의미 내가 5 VC와 하나 개의 로그인 VC 및 모든 서버 기본 URL 가서 그 후 의미 .SO 설정 페이지를 편집 사용자까지 동일해야 설정 편집 사용자는 응용 프로그램 재 시작을 시작한 다음 모든 서비스를 가져와야합니다.

답변

4

분명히 공유/싱글 톤 인스턴스가 문제에 대한 올바른 아키텍처가 아닙니다. 나는 여기에서 sharedClient의 사용을 없애고 그것을 필요로하는 것에 인스턴스를 전달하려고 노력할 것입니다. 그렇게하면 당신은 그것을 파괴 할 수 있고 필요할 때 새로운 것을 만들 수 있습니다.

당신이 싱글 톤을 너무 깊이 썼기 때문에 실용적이지 않다면, "is-a"가 아닌 GYMAFOAuthClient이되도록 이되도록 수정해야합니다. 그렇게하면 재구성 할 수 있습니다.

+0

초심자 issues.please는 무엇을 해야할지 설명합니다. 나는 거의 모든 것을 끝내었고, 완전한 변화는 약간의 문제입니다 !! 하지만 다시 쓸 수 있도록 더 설명 할 수 있니? –

+0

@bbum 한 가지 의심. 내가 이런 식으로 시도하면 oauth는 나를 위해 문제가된다. 나는 로그인 페이지에서 얻을 수있는 토큰으로 클라이언트 헤더를 설정하므로 공유/싱글 톤 인스턴스로 설계되었다. 내가 관리 할 수 ​​있을까? –

0

당신은 그러나 당신은 또한 AFOSharedClient의 속성으로 URL을 만들 수

+ (GYMAFOAuthClient *) clientWithURL:(NSURL*) url { 

GYMAFOAuthClient *client = nil; 
    if (url==nil) { 
     [[[UIAlertView alloc]initWithTitle:@"Required" message:@"Please enter the required fields in the settings page of the application" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]show]; 
    } 
    else 
    { 
     client = [GYMAFOAuthClient clientWithBaseURL:url clientID:kClientID secret:kClientSecret]; 
    } 
return client; 
} 
0

내가 이것에 롭에 동의이 코드를 사용하여 오토 릴리즈 객체를 얻을 수 있습니다.

그러면 메모리에있는 지점에 대한 포인터 일 뿐이므로이를 업데이트 할 수 있어야합니다.