2012-04-10 7 views
1

네트워킹 작업에 GCD를 사용하고 있습니다. 서버에서 데이터를로드하는 테이블보기 컨트롤러가 있지만이 컨트롤러를두고 다른보기 컨트롤러를 시작하면 응용 프로그램이 충돌합니다. 이 문제에 대한 해결책을 찾을 수 없습니다. 서브의 응답은 테이블 뷰의 데이터 소스 인 NSArray입니다. 응답을 받으면 컨트롤러에 데이터 소스 속성을 설정합니다. 나는 setter를 오버라이드하고 현재 뷰가 테이블 뷰인지 확인하고 테이블을 다시로드하는지 확인한다. 내가 잘못 접근하고 있습니까?네트워크 작업용 GCD iOS

고마워요.

+0

이 작업과 관련된 코드를 게시하십시오. 충돌의 디버그 출력은 무엇이며 충돌은 어디에서 발생합니까? –

답변

0

다양한 소리가 들릴 수 있습니다. 나의 충고는 문제를 점차적으로 작은 조각들로 나누는 것이다. 이것은 반드시 빠르고 쉽지는 않습니다. 그러나 당신은이 문제를 발견 할 것입니다. 그리고 그 과정에서 많은 것을 배웁니다.

첫 번째 단계는 네트워크에서 들어오는 데이터를 일부 로컬 데이터로 바꾸는 것입니다. 그래도 문제가 발생하면 네트워크 응답을 처리하는 코드를 배제 할 수 있습니다.

다른 방법으로 이동할 수도 있습니다. 요청에서 반환 된 데이터 만 검사하면됩니다. 앱에 전달하지 마세요. 아마도 응답에서 비어 있거나 부적절하게 형식화 된 데이터 등을 알게 될 것입니다.

참고 : 서버가 NSArray을 반환하지 않는다고 생각합니다. 구별이 명확한 지 확인하십시오 (형식이 지정된 데이터 (예 : json)가 수신되어 파싱 된 것 같습니다).

+0

죄송합니다. 블록이 NSArray를 반환하는 것을 제외했습니다. 나는 실제로 문제를 추적했다. 충돌은 objc_msgSend() 오류입니다. 그래서 내 컨트롤러가 출시되고 출시 된 객체에 대한 메소드를 호출하려고합니다. 컨트롤러에 현재 화면이 있는지 확인하고 메서드가 호출되는지 확인합니다. 그러나 컨트롤러가 현재 화면 상에 존재하지 않으면이 메서드는 여전히 호출됩니다. 따라서보기가 업데이트되지 않도록 다른 방법을 찾아야합니다. 어떤 충고? – ish13

+0

일반적으로 해제 된 객체를 nil로 설정하여 해제 된 객체에서 메소드를 호출하는 것을 방지 할 수 있습니다. 메소드를 호출하기 전에 객체가 존재하는지 확인하는 것이 좋습니다 :'if (myObject) [myObject someMethod]; ' – SundayMonday

+0

그것은 이미 이와 같이 설정했지만 여전히 메소드를 호출하고 있습니다. 따라서 컨트롤러는 여전히 메모리에 있어야하고 언젠가는 나중에 릴리스 될 것입니다. 다른 조언? 감사 – ish13