2016-12-19 7 views
5

GCD를 사용하여 영역에 액세스하는 방법에 대한 설명서의 내용입니다.autoreleasepool에서 영역을 사용하는 올바른 방법은 무엇입니까?

"디스패치 대기열에서 영역에 액세스 할 때 명시적인 자동 해제 풀을 사용해야합니다."

Documentation

나는 내 응용 프로그램에서이 연습을 사용했지만 갑자기 내 콘솔에 다음과 같은 메시지가 표시 오전 : "RLMRealm 인스턴스는 쓰기 트랜잭션 동안 해제했다".

오류가 발생하지 않고 자동으로 콘솔에 인쇄 중입니다. 데이터베이스에 아무 것도 기록되지 않습니다.

매우 유사한 것 같아 github에서이 문제를 발견했습니다.

내 질문은 지금 : 어떤 연습을 사용해야합니까? 영역 설명서에 사용 된 것과 github 문제에서 발견 된 답변은 무엇입니까?

설명해 주셔서 감사합니다.

답변

3

GCD 블록 자신의 @autorelease 풀을 관리하지만, 거기가 실제로 발생합니다 보장은 없다, 그리고 그 자체가 완료된 블록 후 상당한 시간을 발생할 수 있습니다

영역 읽기 유지 (이 SO answer 참조) 스레드간에 모든 인스턴스의 잠금 (쓰기 트랜잭션이 다른 스레드에서 열려있는 동안 영역에서 읽는 것이 가능합니다.) 결과적으로 완료시 Realm 인스턴스를 명시 적으로 dealloc하는 것이 좋습니다 디스크 공간을 확보 할 수 있습니다.

@autoreleasepool을 사용하지 않으면 아무런 문제가 발생하지 않습니다. 디스크에있는 영역 파일의 크기 만 증가합니다.

@autoreleasepool 블록을 사용하고 모든 쓰기 트랜잭션이 해당 블록 내에서 커밋되도록하는 것이 가장 좋습니다.

@autoreleasepool { 
    let realm = try! Realm() 
    try! realm.write { 
     // ... perform changes 
    } 
} 

일반적으로 당신이 안전하게 커밋 잊지 않고 트랜잭션을 수행 할 수 있습니다, 또한 몇 가지 추가 오류 처리를 제공하기 때문에 beginWrite()/commitWrite() 이상 realm.write를 사용하는 것이 좋습니다.

GitHub의 문제는 쓰기 트랜잭션이 커밋되기 전에 @autoreleasepool이 종료되도록하는 논리 경로가 있다는 것입니다. 이 경우 코드 논리를 검토하고 비슷한 점이 없는지 확인해야합니다.

+0

'아무것도 나쁘지 않을 것이다; 디스크의 Realm 파일 크기 만 증가합니다. 너무 오래 걸리면 Realm 크기가 크게 늘어날 수 있습니다 (동시 스레드 수에 따라 다름). – EpicPandaForce

+0

여기에는 해당되지 않습니다. 장기 실행 트랜잭션이 트랜잭션 로그 크기를 늘리는 경우입니다. 배경을 소모하지 않음 렐름 인스턴스는 절대 크기를 크게 늘리지는 못했지만 필요 이상으로 커지게되었습니다. 어쨌든 우리는 트랜잭션 로그 문제를 알고 있으며 해결책을 찾고 있습니다 : https://github.com/realm/realm-core/issues/2343 :) – TiM