2010-01-16 2 views
1

내 앱의 네트워킹 코드를 중앙 집중화하려고합니다. 기본적으로 서버의 정보가 필요한 다양한 장소에서 정보를 얻기 위해 ServerRequest 클래스의 객체 serverRequest를 만듭니다. ServerRequest가 완료되면 정보를 호출 객체로 다시 보내야합니다. 물론 비동기 적으로 작동해야합니다. 대기하는 동안 내 앱이 중단되기를 원하지 않습니다.내 목표 C 앱의 네트워킹 코드를 중앙 집중화

이 정보의 반환은 까다로운 부분입니다. 내 옵션이 위임 및 통지 인 것 같습니다. 내가 말할 수있는 한, 그들은 모두 이슈를 가지고있다.

위임 : 나는 serverRequest 객체에 대한 위임자로서 자신을 전달한다. 문제는 요청이 완료되기 전에 할당을 취소하면 serverRequest가 할당 취소 된 객체를 메시징하고 ​​프로그램이 중단된다는 것입니다. 이것을 방지하기 위해, 나는 내 서버 요청 (둘 이상있을 수 있음)을 모두 추적해야하고 내 dealloc 메소드에서 모두 알려서 더 이상의 메시지를 얻지 못하게해야합니다. 이 모든 것이 가능하지만 분명 고통스러운 것처럼 보입니다.

알림 : 정보를 전달하는 데 많은 작업이 필요합니다. 나는 자신을 통지 센터에 옵서버로 추가해야하고 할당을 취소 할 때 자신을 제거해야합니다. 또한 ServerRequest에 게시 할 알림 종류에 대한 정보를 전달해야합니다. 그리고 ServerRequest는 수신 된 데이터를 NSDictionary로 밀어 넣어야합니다. 그러면 NSDictionary가 전달 된 후 다시 가져옵니다.

두 가지 방법 모두 작동해야하지만 둘 다 ServerRequest가 호출 코드를 깨우고 객체를 전달하는 데 막대한 노력이 필요합니다. 알림이 좀 더 유연하고 통증이 적으며 사고를 일으킬 가능성은 적지 만 두 방법 모두에 만족스럽지 않다고 생각합니다. 모든 의견을 주시면 감사하겠습니다. 감사.

답변

0

전달 된 대리인을 유지할 수 있으므로 서버 요청이 완료 될 때까지 할당 취소되지 않습니다.

@interface ServerRequest : NSObject 
{ 
    id delegate; 
} 

@property (retain) id delegate; 
@end 

@implementation ServerRequest 
@synthesize delegate; 
@end 

은 그러나 당신은 다른 끝에서 ServerRequest에 방출 방지하기 위해 필요하거나 그 자체가 해제 될 때 ServerRequest에의 개시가 해제 할 수 있으며, 그 문제를 데려 갈 것입니다. 이를 위해서

@interface SomeObject : NSObject 
{ 
    ServerRequest getsomedata; 
} 

@property (retain) ServerRequest getsomedata; 
@end 

- (void)f() 
{ 
    [self setGetsomedata:[[ServerRequest alloc] init]]; 
    [[self getsomedata] release]; // take away the refcount from allocating, setting the property will retain 
} 
1

목록 접근 방식을 사용합니다. 모든 요청을 추적하는 NSMutableArray를 포함하는 requestController를 가지고 있습니다. 이 기능의 장점은 컨트롤러가 할당 해제되면 [요청 makeObjectsPerformSelector : @selector (cancelRequest)]와 같은 작업을 수행하여 모든 요청을 네트워크에서 제거 할 수 있다는 것입니다. 또한 보류중인 요청을 각 오브젝트에 실제로 물을 수 있기 때.에 많은 보류중인 요청의 성능 영향을 계측 할 수 있기 때.에, 디버깅에 도움이됩니다. 요청이 완료되면 요청 컨트롤러에 알릴 수 있고 간단하게 removeObject

누군가이 (가) 객체를 소유하고 있어야합니다. 수동으로 관리되는 메모리에서 ObjC 객체는 자체적으로 유지할 수 있지만 GC로 이동하려는 경우 배열을 사용하면 CFRetaining 자유 부동 객체보다 훨씬 더 깨끗한 솔루션입니다.

0

이전에도 유사한 문제가 발생했지만 약간 다른 디자인을 선택했습니다 (@uliwitness와 유사 함).

요청 (즉, 실제 콘텐츠)을 전달 시스템에서 분리하도록 선택합니다. 귀하의 경우에는 serverRequest가 요청 내용 (URL, 데이터 등)을 보유하고 있지만 서버와의 실제 통신은 수행하지 않는다는 것을 의미합니다. 서버 요청에 대한 델리게이트는 실제로 요청을 보내고받으며 델리게이트에게 요청 완료를 알리는 싱글 톤 CommLayer 클래스입니다.

그래서 serverRequest를 보내려면 [CommLayer sendRequest : serverRequest withDelegate : myDelegate]를 호출하면됩니다.

는 이제 CommLayer가 ServerRequest에 위임을하지 보유하고 실제 클래스이며, 당신은 항상 당신의 클래스는 더 이상 같은 것을 사용하여 유효하지 않은 CommLayer을 알릴 수 있습니다 [CommLayer removeDelegate는 : myDelegate]

는 물론 그것은 더 많은 작업입니다 하지만이 디자인에서 많은 이점을 얻을 수 있습니다.

  • 실제 네트워크 트래픽 관리. 한 번에 원하는 연결 수와 대기열 요청 수를 결정할 수 있습니다.
  • 불필요한 요청을 취소 할 수 있습니다.