2010-03-23 4 views
2

NSURLConnection에 문제가 있고 [connection connectionWithRequest]를 호출하면 약간의 부하가 발생하지만 [연결 취소]는 정상적으로 작동합니다. 그러나 때로는 [연결 취소]를 호출 한 후에도 연결의 대리자가 여전히 호출됩니다 (응용 프로그램이 충돌 함). 그것 주위의 인터넷 검색은 runloop의 경쟁 상태 인 것처럼 보입니다. 연결을 취소하고 대리인을 릴리스하지만 실행 루프주기 전에 대리자 함수 -> 충돌을 호출합니다.NSURLConnection 여전히 대리자를 호출합니다. 취소 메서드가 호출 된 후

내가 [연결 취소]를 호출 한 후 연결이 실제로 취소되었다는 것을 확인하는 방법이 있습니까? 심지어 엉터리 동안() 루프 할 것 :(

+0

여기에서 같은 문제가 발생합니다. 대다수의 경우,'cancel'이 제대로 작동하고, delegate에 대해'connectionDidFinishLoading'도'connectionDidFailWithError'도 호출되지 않습니다. Delegate 객체의 수명이 다 된 Just-In-case 확장이 부족한 것처럼 보입니다. –

답변

6

당신의 대리인이 중 하나 connectionDidFinishLoading: 또는 connectionDidFailWithError: 메시지가.

Delegates are not normally retained by the object they're acting as delegate for. 그러나이 경우에는이되어 수신 할 때까지 당신은 연결 & 관련된 스토리지를 공개하지한다, 그래서 NSURLConnection이 여전히 그것을 참조하는 동안 대리자가 무효화되지 않아야합니다.

+0

어림짐작의 좋은 규칙, 나는 이것을 실행하는 시도 할 것이다. – Shizam

+0

@David Gelhar -이 경우에는 그대로 유지되지만 대리인은 정상적으로 유지되지 않습니다 **. Apple의 docs에서 "Delegating objects는 그들의 delegate를 유지하지 않고 유지해야합니다. 그러나 delegate 객체의 client (일반적으로 application)는 그들의 delegate이 위임 메시지를받을 수 있도록 보장 할 책임이 있습니다. 대리자를 메모리 관리 코드로 유지하십시오. " http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/CommunicateWithObjects.html#//apple_ref/doc/uid/TP40002974-CH7-SW18 – DougW

+1

Apple 문서를 제외한 위임자는 취소 후에 더 이상 호출되지 않으므로 정상적인 경우에는 connectionDidFinishLoading 또는 connectionDidFailWithError를 절대받지 못합니다. – user1055568

0

아직이 문제가 발생하지 않았지만 위임 객체를 묶지 않고도 작동 할 수 있습니다.

모든 대리자 메서드는 호출 Connection 객체를 매개 변수로받으며 실제 활성 Connection 객체 (또는 nil)를 알고 있기 때문에 두 객체를 비교하여 위임 작업을 무시하면됩니다. 이렇게하면 취소 된 "유령"Connection 객체는 여전히 델리게이트를 호출 할 수 있지만 내부를 간섭하지는 않습니다. _URLConnection 활성 연결, 또는 전무로 설정 대리자의 한 속성입니다

- (void) connection:(NSURLConnection*) connection didReceiveData:(NSData*) data 
{ 
    if(connection != _URLConnection){return;} 
    ... 
    [_incomingData appendData:data]; 
    ... 
} 

.

관련 문제