2011-04-18 3 views
9

내비게이션 기반 앱이 있습니다. 기본보기에서 버튼을 누르면 내비게이션 컨트롤러에 새보기가 푸시됩니다. 모든 기본적인 것들.asihttprequest가 내 앱을 닫습니다.

새로운보기가로드되면 이미지 URL 목록 인 일부 json 데이터를 가져 오기 위해 ASIHTTPRequest를 수행합니다. 그런 다음 for 루프를 수행하고 많은 수의 ASIHTTPRequests를 작성한 다음 대기열에 추가 한 다음 대기열을 실행합니다.

대기열이 완료되기 전에 뒤로 버튼을 클릭하면 응용 프로그램이 다운되고이 응용 프로그램은 집을 표시하고 잘못된 집을 선택하고 사진이 표시되기 전에 매우 빨리 뒤로 돌아서 bumm crash를 할 수 있습니다.

이 스레드 http://groups.google.com/group/asihttprequest/browse_thread/thread/3d4815198aa889b9은 뷰에 대한 모든 요청을 취소하지 않고 델리게이트를 nil로 설정하고 큐를 해제한다는 것을 제외하고는 내 문제를 실제로 잘 설명합니다.

여전히 충돌합니다. 3G를 사용하면 매번 충돌이 발생하지만 Wi-Fi를 사용하면 충돌을 일으키기가 정말 어렵지만 꽤 할 수 있습니다. 디버거가 ASIHTTPRequest.m이 라인에 점프

(void)requestReceivedResponseHeaders:(NSMutableDictionary *)newResponseHeaders { 
    if ([self error] || [self mainRequest]) { return; } 
--> if (delegate && [delegate respondsToSelector:didReceiveResponseHeadersSelector]) { 

많은 많은 경우에 점프 거의 80 %의 경우에

:이 간다 인스턴스의 소수에

(void)requestReceivedResponseHeaders:(NSMutableDictionary *)newResponseHeaders { 
    if ([self error] || [self mainRequest]) { return; }  
---> if (delegate && [delegate respondsToSelector:didReceiveResponseHeadersSelector]) { 

광고를 내 메인 루프

int main(int argc, char *argv[]) { 
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
--> int retVal = UIApplicationMain(argc, argv, nil, nil); with SIGBART error [pool release]; return retVal; 

저는 MBP와 MacPro, 최신 OS X, Xcode 4.0.2를 사용하고 있습니다. 원래 iPhone을 제외하고 pple 장치.

정말 내 전체 앱을 다시 쓰고 싶지 않지만 ASIHTTPRequest와 비교해 볼만한 것이 있습니까?

답변

3

오류가 대리자가 설정되어 있습니다.

나는 이것을 고치는 2 가지 방법을 발견했다.

나는 못 생겼다고 생각하는 방식은 모든 네트워크 트래픽을 처리하고 응용 프로그램이 처음 실행될 때 인스턴스화되는 범용 대리인을 만드는 것입니다. 실제로 애플 리케이션 위임을 사용하고 nsnotification 센터 메시지를 들어요. 그것은 매력처럼 작동합니다. 앱은 결코 충돌하지 않지만 최적이 아니라고 생각합니다.

가장 좋은 방법은 대리인을 설정하지 않고 "setDidFinishSelector"를 사용하지 않고 대신 "setCompletionBlock : ^"을 사용하는 것입니다. 이것은 iOS 4.0 이상을 실행하는 기기에서만 작동하며 90-95 % 이상 성장합니다. 이것은 단지 멋진 방법이며 응용 프로그램을 손상시키지 않습니다.

+0

좋은 답변, 그 작업 – KsK

+0

두 번째 방법을 사용하면 실제로 작동합니다. 감사. 나는 이것에 너무 오래 걸렸다. 건배. –

3

ASIHTTPRequest보다 나은 것을 찾을 수 없을 것입니다. 문제는 어떻게 사용하고 탐색에서 사라지는 대표는 처리해야 할 공통적 인 문제입니다.

사용자 탐색으로 인해 대기열이 처리되는 viewcontroller와 관련하여 문제가있는 것처럼 들립니다. 이러한 문제를 해결하는 가장 좋은 방법은 모든 커뮤니케이션을 처리하고 해당 라이프 사이클 동안 클래스를 유지하는 중앙 모델 클래스를 사용하는 것입니다.

그런 식으로 대리자가 예기치 않게 사라지면 설명 할 수없는 충돌이 발생하지 않습니다.

옵션 2

또 다른 방법은 네트워크 작업이 완료 될 때까지 사용자 탐색을 비활성화 할 수 있습니다. uiactivityview를 보여주는 모달보기를 전체 화면에 두어 사용자가 자신의 작업이 차단되고 있음을 알 수 있습니다. 그런 다음 데이터가 도착하면 모달 뷰를 사라지게 할 수 있습니다. 그래디언트로 화면을 멋지게 디자인하면 배경이 조금 흐려지기 때문에 괜찮아 보일 수 있습니다. 그러나 실제로는 최선의 방법은 아닙니다. 대신 대리인 인 AWOL을 수정해야합니다.

정확한 문제를 찾으려면 대기열 생성, 삭제 등과 관련된 코드가 더 필요할 것입니다.

+0

어떻게 그러한 중심 클래스가 생겼습니까? –

+0

중앙 클래스가 싱글 톤이라고 가정합니다. –

+0

한 번만 인스턴스화되고 앱 대리인이 보유한 싱글 톤 또는 클래스. – Roger

1

응용 프로그램 대리인은 요청 큐 배열을 소유 할 수 있습니다. 배열은 네비게이션 컨트롤러 스택 및 관련 뷰의 상태와 독립적으로 작동합니다.nav 스택의보기 컨트롤러에 요청을 묶고 부모보기로 다시 터지지 않도록 UI 트릭을 수행하는 대신 앱 위임 대기열 인스턴스에 요청을 추가하거나 모든 요청을 중지하고 대기열을 비울 수 있습니다.

+0

그런 싱글 톤 대리자를 만드는 방법에 대해 설명해 주시겠습니까? 아니면 그냥 응용 프로그램 대리인을 사용 하시겠습니까? 당신 생각은 재미 있다고 들리지만, 나는 그것을 완벽하게 묘사 할 수 없다. –

+0

앱 대리인 만 사용하십시오. 또는 응용 프로그램 대리인이 소유 한 싱글 톤을 만들 수 있습니다. 당신은 "코코아 싱글 톤"에 대한 더 많은 정보를 위해 SO를 검색 할 수 있습니다. –

12

-viewWillUnload에서 대표자를 취소하고 설정을 해제하고 -viewDidUnload 대신 시도해보십시오. 나는 그 두 UIViewController 메서드를 호출하는 사이에 실제로 언로드하는 시간의 창을 당신이 충돌 할 수있는 시간대라고 생각한다. 델리게이트가 사라졌지 만 아직 ASIHTTP 요청 객체를 말하지 않았습니다.

+6

viewWillDissapear에서 트릭을 수행 한 것처럼 보입니다. 적어도 충돌을 일으키지는 못했습니다. 나는 다음과 같은 코드를 추가했음을 확신했다. - (void) viewWillDisappear : (BOOL) animated { [super viewWillDisappear : animated]; (ASIHTTPRequest * req in [대기열 작업]) { [req clearDelegatesAndCancel]; [req setDelegate : nil]; [req setDidFailSelector : nil]; [req setDidFinishSelector : nil]; } [queue cancelAllOperations]; [queue setDelegate : nil]; } –

관련 문제