0

ARC와 함께 사용할 수있는 자체 보유 네트워크 라이브러리를 구현하고 싶습니다.자체 유지 네트워크 구현을위한 요리법 lib

이 lib의 호출 코드는 다음과 같아야합니다. 트위터 프레임 워크 클래스 (내가 지금 사용되지 않는 잘못 아니에요 경우)

- (void)downloadData { 

    NSURL *url = // alloc-init 
    NetworkFetcher *networkFetcher = [[NetworkFetcher alloc] initWithURL:url]; 
    [networkFetcher startWithCompletionHandler:^(NSData *data){ 
     _fetchedData = data; 
    }]; 
    // under ARC it will put a release call for the networkFetcher here 
} 

이 접근법은 TWRequest에 의해 사용된다. 장점은 호출자가 fetcher를 그대로 유지할 필요가 없다는 것입니다.

일부 세부 정보입니다. startWithCompletionHandler은 향후 재사용을 위해 블록을 복사합니다. 요청이 끝나면 fetcheher는 블록을 설정 해제합니다.

그럼 내가 따라야 할 접근법은 무엇일까요? 따라서 가져 오기 프로그램을 자체 유지할 수 있습니까? 어떤 가장 좋은 목사?

답변

2

당신은 NetworkFetcher 클래스에 클래스 확장에서 "개인"속성

@interface NetworkFetcher() 
@property (strong, nonatomic) NetworkFetcher *selfRef; 
@end 

를 추가 할 수 있습니다. startWithCompletionHandler에서 개체의 할당이 해제되지 않도록하려면

self.selfRef = self; 

으로 설정하십시오. 요청이 완료되고 완료 블록이 호출되면 보관주기를 파괴하려면

self.selfRef = nil; 

을 설정하십시오.

+1

... 속성은 클래스 확장 내에서 삽입되어야합니다. –

+1

@flexaddicted : 맞습니다. 구현에만 표시되며 따라서 클래스 확장에 정의되는 "개인"속성이어야합니다 . - 이에 따라 답변이 업데이트되었습니다. –

1

나는 보통 마틴 R이 묘사 한 기법을 사용합니다.이 기술은 기본적으로 이전의 retainrelease을 모방하지만 다른 방법도 있습니다.

completionHandlerfetcher을 캡처 할 수 있습니다. 완료 핸들러의 어느 곳에서나 self을 사용하고 호출되었을 때 블록을 놓는 것을 잊지 마십시오. 이것은 속성을 사용하여 읽기가 다소 덜하지만 동일한 원칙을 따릅니다.

또 다른 방법은 활성 fetcher의 singleton (변경 가능) 배열을 갖는 것입니다. 추가/제거는 self.selfRef 속성과 동일한 원칙을 따릅니다.

단일 배열을 사용하면 원하는 경우 언제든지 가져 오기 기능에 액세스 할 수 있으며 활성 게시자 수를 얻을 수 있습니다 (예 : 동시 다운로드 수 제한).

+0

답장을 보내 주셔서 감사합니다. –

+0

completionHandler *에서 fetcher를 캡쳐한다고 말하면 블록 내에서 * self *를 캡처한다는 의미입니까? 또는 fetcher 클래스 내에서 * self *를 캡처합니까? –