2014-09-03 2 views
2

저장된 모든 사용자 (RLMObject) 개체를 검색하려고합니다. 그런 다음 저장된 모든 개체가 있는지 확인합니다. 그렇지 않으면 새 사용자 개체를 만들고 저장하려고합니다.쓰기 트랜잭션 외부에서 개체를 수정하려고 시도했습니다.

RLMArray *allUsers = [User allObjects]; 

if (allUsers.count == 0) { 
     RLMRealm *realm = [RLMRealm defaultRealm]; 
     [realm beginWriteTransaction]; 

     User *newUser = [[User alloc]init]; 
     newUser.userID = [userDict[@"id"] integerValue]; 
     newUser.role = userDict[@"role"]; 
     newUser.email = userDict[@"email"]; 
     newUser.given_name = userDict[@"profile"][@"given_name"]; 
     newUser.family_name = userDict[@"profile"][@"family_name"]; 

     [realm addObject:newUser]; 
     [realm commitWriteTransaction]; 

    } 

그러나이 메시지와 함께 충돌 : 'RLMException', reason: 'Attempting to modify object outside of a write transaction - call beginWriteTransaction on a RLMRealm instance first.'

난 정말 이유를 알고하지 않습니다. 기본 영역에서 쓰기 트랜잭션 내에서 객체를 수정합니다. 사전에

감사합니다!

+1

앱이 충돌하는 곳이 확실합니까? – trojanfoe

+0

@trojanfoe 당신이 맞습니다. 그것은 추락 한 곳이 아니 었습니다. – Sebyddd

답변

0

내 바보 같은 실수는하지 마라. 고맙습니다 @ 트로이 호프가 머리를 위로합니다.

백그라운드 스레드에서 이미지를 다운로드하고 완료되면 영역에 저장하려고합니다. defaultRealm 두 번째로 다른 인스턴스를 반환하는 것처럼 보입니다.

+0

defaultRealm은 항상 동일한 경로를 반환하지만 호출 된 각 스레드에 대해 다른 인스턴스를 반환합니다. 팀의 대답은 정확했습니다. – jpsim

+0

@jpsim 죄송합니다. 그 말을하고 싶습니다. 고맙습니다! – Sebyddd

2

스레드마다 한 번씩 RLMRealm defaultRealm을 호출하여 다른 RLMRealm 인스턴스 (동일한 파일 경로이지만 다른 변수)를 가져와야합니다. 이렇게하면 모든 스레드 안전을 쉽게 정렬 할 수 있습니다. 자세한 내용은 http://realm.io/docs/cocoa/0.84.0/#using-a-realm-across-threads을 참조하십시오.

관련 문제