2015-02-05 3 views
0

NSMutableArray를 대기열로 사용하는 동안 이상한 문제가 발생합니다.대기열로 NSMutableArray를 사용하면 작동하지 않습니다.

주어진 단일 객체 SO, ViewController 객체 VC 및 NSMutableArray MA. MA는 SO에 의해 수신 된 ID의 대기열로 사용되고 있으며 ID를 MA에두고 VC가 처리한다는 알림을 보내 VC에 전달됩니다. MA가 보유하고있는 것을 잃어 버리는 문제가 있습니다. 문제에 관한

단계 : Seque보기를로드 개시

  1. .
  2. SO는 서버에 ID를 요청합니다.
  3. VC의 viewDidLoad가 완료됩니다.
  4. SO 블록 기능은 ID를 받아 MA에 넣고 VC에 알림을 보냅니다.
  5. VC 통지를 수신하고, 문제가없는보기 부하 MA

에서 처음으로 ID를 검색한다. 그러나 내가보기에서 나가서 4 단계에서 MA의 크기보다 큰 단계를 반복하면 1 단계로, 5 단계에서 MA의 크기는 0입니다. MA가 비게됩니다!

알림이 전송 된 시점 (4 단계)과 알림 처리기가 호출 된 시점 (5 단계) 사이에 MA가 불가사의하게 빈 상태가되는 방식에 대해 필자는 당황 스럽다. VC 알림 처리기 외부의 배열을 지우고있는 것은 없음을 확인했습니다.

가능한 단서는 viewDidLoad에서 (메시지가 obj C에서 전송 됨)라는 메서드가 있으며 설명 된 문제가 주석 처리되지 않은 경우 발생한다는 것입니다. 또한 (주석 처리하는 대신) viewDidLoad 메서드 다음에 줄을 넣으면 문제가 발생하지 않습니다.

[[NSRunLoop currentRunLoop] runUntilDate : [NSDate dateWithTimeIntervalSinceNow : 0.5]];

나는 이것에 머리를 쓰고있어. 내 최근 생각은 내가 이해하지 못하는 NSMutableArray에 관한 것입니다. 나는 MA가 그것에 배치 된 ID에 대한 강력한 참조를 저장하고 있다고 생각했지만, 그렇지 않다면 어쩌면 어떤 이상한 일이있을 것입니다.

누구든지 아이디어가 있습니까?

+0

어떻게 배열이 가변 배열에서 제거 되었습니까? 누구에 의해? 같은 배열을 다루고 있는지 100 % 확신하고 있습니까? 아니면 라인을 따라 어딘가에 다시 인스턴스화되거나 복사 될 가능성이 있습니까? (이러한 다양한 호출을 통해 배열 자체와 관련된 주소를 비교하십시오.) 또한이 모든 것이 주 스레드에서 발생 했습니까? 다시 말해, 스레드로부터 안전하지 않은 NSMutableArray를 어떻게 동기화하고 있습니까? (제쳐두고, 항목을 추가하는 객체가 하나 있고 다른 객체를 제거한 것이 맞다면 나는 조심 스럽습니다.이 인터페이스를 조정하는 단일 인터페이스를보고 싶습니다.) – Rob

+0

pointe to MA는 SO의 속성이며 appDelegate의 didFinishLaunchingWithOptions에서 alloc'd 및 init'd입니다. – bhartsb

+0

수신 된 단일 ID는 VC 알림 핸들러에 의해 removeObjectAtIndex : 0과 함께 제거됩니다.MA에 대한 포인터는 SO의 속성이며 appDelegate의 didFinishLaunchingWithOptions에서 alloc'd 및 init'd입니다. 내가 아닌 스레드 안전 MA를 동기화 아니에요하지만 난 4 월에 SO 블록 함수에 의해 석사에서 ID를 가하고 4 단계에서 알림을 보내고 5 단계에서 검색 – bhartsb

답변

0

문제점은 VC의 viewDidLoad가 완료 될 때마다 NSNotificationCenter addObserver :가 호출된다는 것입니다 (3 단계). 이로 인해 알림 자체가 한 번 게시 된 경우에도 알림 핸들러가 추가 된 횟수만큼 호출되지 않았습니다.

다음은 관련입니다. How to stop the Observer in NSNotification to called twice?

관련 문제