2016-12-09 3 views
0

url이라는 String 속성으로 Realm Object (File이라고 부름)가 있습니다. url에 대한 참조를 포함하는 Alamofire DownloadRequest.DownloadFileDestination 블록을 만들었으므로이 파일을 다운로드 할 수 있습니다. 그러나이 블록은 백그라운드 스레드에서 실행되므로 Realm은 예외를 발생시킵니다. 실제로 전체 Realm 또는 File 객체 전체에 액세스 할 필요는 없습니다. 속성 url 만 필요합니다. 따라서 Realm에서 File 객체를 백그라운드 스레드로 열려고 할 이유가 없습니다.다른 개체로 전달하기 위해 값을 복사하는 방법

이 문자열 (또는 다른 유형의 속성)을 Realm 객체 밖으로 복사하여 다른 스레드로 전달하는 올바른 방법은 무엇입니까?

현재의 솔루션은 작동하지 않지만 매우 우아하지 않은 것처럼 보입니다.

let url = "\(object.url)"

이 질문에

는 코드의 특정 블록에 관련이 없습니다 - 더 개념적인 질문이다.

+0

유형에 대해 자세히 알려주십시오. 'url' Swift의'String' 유형입니까? 그렇다면 그것은 값 유형이므로 "참조"가 있다는 것은 무엇을 의미합니까? –

답변

0

이 당신이 Realm's docs for threading를 읽는다면, 당신이 메인 스레드에 File 객체를 가져 의미 you cannot have multiple threads sharing the same instances of Realm objects을 말했다 정상입니다, 당신은 귀하의 경우, 다른 스레드에서 사용할 수없는 것은 Alamofire 배경 스레드

무엇 당신은 올바른지, URL의 값을 다른 변수에 할당하면 fetchFile().url을 호출합니다. fetchFiles()은 파일 객체를 다시 가져옵니다 (파일 객체를 다시 가져 오십시오 -하지만이 경우 성능이 떨어지며 영역 객체가 변경된 다른 경우에만 유용합니다). 많이)

+0

이것이 영역의 예상되는 동작이라는 것을 알고 있습니다. 내 질문은 이러한 제약 조건 내에서 작업하는 방법이었습니다. 'let url = object.url'과 같은 속성을 Realm에서 연결 해제하고 실시간으로 객체를 업데이트합니까? – dmorrow

+0

그래, 내가 말했듯이, 당신이 단순히 그것을 사용하기를 원한다면, 또는 방금 여러 스레드에서 그것을 변경해야 할 경우 realm 객체를 전달하는 대신 alamofire에 페칭 함수를 전달하여 다른 스레드에서 다시 가져 오는 것이다. – Tj3n

0

간단히 말해서 let url = object.url은 val을 복사합니다. ue는 스레드로부터 안전합니다.

관련 문제