0
내가 다음 코드를 트위터 내 응용 프로그램을 인증하려고

: 나는 (? 쓸모없는) 루프 라인 23ffiOS6 및 ACAccount : Twitter 유형이 사라 집니까?

for (ACAccount *acc in arrayOfAccounts) { 
    [acc accountType].identifier; 
    //Otherwise the identifier get lost - god knows why -__- 
} 
를 제거하는 경우, pastebin

그러나이

acc.type는 (널)가 오면된다 AccountHandler checkAccountOf:acc에서 추가로 실행됩니다. 루프를 그대로두면 유형이 올바르게 설정됩니다. 나는 그것이 내가 블록에 있고 그 다음 메인 큐로 이동했다는 사실과 꽤 관련이 있다고 확신한다. 그러나 나는 잘못된 것을하고 있는지 궁금해하고 있는가? 이 루프는 내가해야만하는 것처럼 보이지 않습니다.

비슷한 결과가 here입니다.

답변

4

ACAccount은 스레드로부터 안전하지 않습니다. 원래의 스레드에서만 사용해야합니다. 그리고이 목적을 위해서 당신은 '쓰레드'를 '큐'라고 읽을 수 있습니다.

NSLog 계정이 있다면 핵심 데이터 개체이고 코어 데이터 개체의 스레드 안전성이 부족하다는 것을 알 수 있습니다.

특정 동작은 핵심 데이터 개체가 오류 일 수 있다는 것입니다. 즉, 보유하고있는 것은 객체에 대한 참조이지만 실제 객체에 대한 참조는 아닙니다. 속성에 액세스하려고하면 객체가 메모리에로드됩니다.

아래에있는 핵심 데이터는 실제로 개체가 필요하다는 것을 알 때까지 메모리에있는 항목을 캐싱하고 오류를 반환하는 것입니다. 이 캐시의 효율적인 조정은 객체를 단일 스레드로 조정하는 Core Data 객체의 개별 인스턴스를 제한하는 것입니다.

개체를 잘못된 스레드의 메모리로 가져와야하는 작업 - 여기 identifier에 액세스 할 때 발생하는 동작 - 그러면 동작이 정의되지 않습니다. nil 결과 만 표시되거나 애플리케이션을 중단시킬 수 있습니다.

(코어 데이터가 이와 같이 작동하는 이유는 개체 그래프를 저장하고 상호 연결된 개체가 1000 개이기 때문에 다른 개체 그룹과 마찬가지로 트래버스 할 수 있지만 일반적으로 원하지 않는 사용하고자하는 정보의 작은 부분 집합에 액세스하기 위해 메모리에 하나씩로드하는 것과 관련된 비용을 지불해야합니다. 따라서 느린 로딩 중에 일반 Objective-C 인터페이스를 제공하는 방법이 필요합니다.

링크 된 코드는 개체가 캐시에 있고 따라서 메모리에 있는지 확인하여 큐 호핑하기 전에 해당 문제를 해결합니다. 따라서 'store from fetch'단계가 올바른 대기열에서 발생합니다. 그러나 코드는 적용 할 논리가 무엇이든 상관없이 객체가 메모리에서 다시 폴트로 전환 될 수 있기 때문에 은 완전히 안전하지 않습니다.

필자는 분명히 그들이 애플의 일부 버그를 발견했다고 생각한다. 그들은 그렇지 않습니다. 그들은 단지 무언가가 스레드로부터 안전하다고 가정하기로 결정했으며 테스트에서 작동하지 않은 정의되지 않은 동작에 의존하는 방법을 찾았습니다.

이야기의 도덕적 : 계정 자체를 단일 스레드에 보관하십시오. 계정 속성으로 일부 처리를 수행하려면 관련 속성을 기본 Foundation 개체로 수집하여 게시해야합니다.

+0

이 답변을 주셔서 감사합니다.내 문제는 UIAlertView가 초기 계정 인증을 처리하는 블록 인 대리인과 작동하지 않는다는 것입니다. 그러나 arrayOfAccounts와 결과는 델리게이트에서 처리되어야합니다. 하나의 스레드에서 어떻게 구현할 수 있습니까? – mmlac

+0

좋아, 내가 필요한 모든 데이터를 AccountHandler 클래스로 이동하고 예상대로 작동합니다. "저자는 분명히 그들이 애플의 일부 버그를 발견했다고 생각한다." 아니, 그들은 왜 그것이 깨지는 지 알지 못했다. ... 당신의 대답에 감사드립니다, accpeted. – mmlac

관련 문제