ProjectedCollection
public struct ProjectedCollection<Element> : RandomAccessCollection, CustomStringConvertible, ThreadConfined where Element : RealmCollectionValue
ProjectedCollection은 프로젝션의 속성에 대한 특수한 유형의 collection으로, Realm 객체의 List
를 프로젝트하려는 경우에 사용해야 합니다. 이 유형은 수동으로 인스턴스화할 필요가 없습니다. List
속성에서 projectTo
을(를) 호출하여 사용합니다.
class PersistedListObject: Object {
@Persisted public var people: List<CommonPerson>
}
class ListProjection: Projection<PersistedListObject> {
@Projected(\PersistedListObject.people.projectTo.firstName) var strings: ProjectedCollection<String>
}
-
선언
스위프트
public typealias Index = Int
-
목록에서 조건자와 일치하는 첫 번째 객체의 인덱스를 반환하거나 일치하는 객체가 없는 경우
nil
을 반환합니다.선언
스위프트
public func index(matching predicate: NSPredicate) -> Int?
매개변수
predicate
객체를 필터링하는 데 사용할 조건자입니다.
-
collection이 변경될 때마다 호출될 블록을 등록합니다.
블록은 초기 결과와 함께 비동기적으로 호출된 다음 컬렉션의 객체 또는 컬렉션에 있는 객체를 변경하는 각 쓰기 트랜잭션(write transaction) 후에 다시 호출됩니다.
블록에 전달되는
change
매개변수는 각 쓰기 트랜잭션(write transaction) 중에 추가, 제거 또는 수정된 객체를 collection 내에서 인덱스 형식으로 보고합니다. 제공된 변경 정보에 대한 자세한 내용과 이를 사용하여UITableView
을 업데이트하는 방법에 대한 예는RealmCollectionChange
문서를 참조하세요.차단이 호출되는 시점에 collection은 완전히 평가되고 최신 상태이므로 동일한 스레드에서 쓰기 트랜잭션 (write transaction)을 수행하지 않거나 명시적으로
realm.refresh()
호출하지 않는 한 해당 스레드에 액세스하면 차단이 수행되지 않습니다. 일.대기열이 제공되지 않으면 표준 이벤트 루프를 통해 알림이 전달되므로 이벤트 루프가 다른 활동에 의해 차단되는 동안에는 알림을 전달할 수 없습니다. 대기열이 제공되면 대신 해당 대기열로 알림이 전달됩니다. 알림을 즉시 전달할 수 없는 경우 여러 알림이 단일 알림으로 병합될 수 있습니다. 여기에는 초기 collection에 대한 알림이 포함될 수 있습니다.
예를 들어 다음 코드는 알림 차단을 추가한 직후 쓰기 트랜잭션(write transaction)을 수행하므로 초기 알림이 먼저 전달될 기회가 없습니다. 결과적으로 초기 알림에는 쓰기 트랜잭션(write transaction) 후 Realm의 상태가 반영됩니다.
class Person: Object { @Persisted var dogs: List<Dog> } class PersonProjection: Projection<Person> { @Projected(\Person.dogs.projectTo.name) var dogsNames: ProjectedCollection<String> } // ... let dogsNames = personProjection.dogsNames print("dogsNames.count: \(dogsNames?.count)") // => 0 let token = dogsNames.observe { changes in switch changes { case .initial(let dogsNames): // Will print "dogsNames.count: 1" print("dogsNames.count: \(dogsNames.count)") break case .update: // Will not be hit in this example break case .error: break } } try! realm.write { let dog = Dog() dog.name = "Rex" person.dogs.append(dog) } // end of run loop execution context
블록에 업데이트를 전송하려는 한 반환된 토큰을 보관해야 합니다. 업데이트 수신을 중지하려면 토큰에서
invalidate()
을 호출합니다.경고
쓰기 트랜잭션(write transaction) 중에는 또는 포함하는 Realm이 읽기 전용일 때 이 메서드를 호출할 수 없습니다.
선언
스위프트
public func observe(on queue: DispatchQueue?, _ block: @escaping (RealmCollectionChange<ProjectedCollection<Element>>) -> Void) -> NotificationToken
매개변수
queue
알림을 수신할 직렬 디스패치 대기열입니다.
nil
인 경우 알림이 현재 스레드로 전달됩니다.block
변경이 발생할 때마다 호출되는 차단입니다.
반환 값
업데이트가 전달되기를 원하는 기간 동안 보유해야 하는 토큰입니다.
-
collection이 변경될 때마다 호출될 블록을 등록합니다.
블록은 초기 결과와 함께 비동기적으로 호출된 다음 컬렉션의 객체 또는 컬렉션에 있는 객체를 변경하는 각 쓰기 트랜잭션(write transaction) 후에 다시 호출됩니다.
블록에 전달되는
change
매개변수는 각 쓰기 트랜잭션(write transaction) 중에 추가, 제거 또는 수정된 객체를 collection 내에서 인덱스 형식으로 보고합니다. 제공된 변경 정보에 대한 자세한 내용과 이를 사용하여UITableView
을 업데이트하는 방법에 대한 예는RealmCollectionChange
문서를 참조하세요.차단이 호출되는 시점에 collection은 완전히 평가되고 최신 상태이므로 동일한 스레드에서 쓰기 트랜잭션 (write transaction)을 수행하지 않거나 명시적으로
realm.refresh()
호출하지 않는 한 해당 스레드에 액세스하면 차단이 수행되지 않습니다. 일.대기열이 제공되지 않으면 표준 이벤트 루프를 통해 알림이 전달되므로 이벤트 루프가 다른 활동에 의해 차단되는 동안에는 알림을 전달할 수 없습니다. 대기열이 제공되면 대신 해당 대기열로 알림이 전달됩니다. 알림을 즉시 전달할 수 없는 경우 여러 알림이 단일 알림으로 병합될 수 있습니다. 여기에는 초기 collection에 대한 알림이 포함될 수 있습니다.
예를 들어 다음 코드는 알림 차단을 추가한 직후 쓰기 트랜잭션(write transaction)을 수행하므로 초기 알림이 먼저 전달될 기회가 없습니다. 결과적으로 초기 알림에는 쓰기 트랜잭션(write transaction) 후 Realm의 상태가 반영됩니다.
class Person: Object { @Persisted var dogs: List<Dog> } class PersonProjection: Projection<Person> { @Projected(\Person.dogs.projectTo.name) var dogNames: ProjectedCollection<String> } // ... let dogNames = personProjection.dogNames print("dogNames.count: \(dogNames?.count)") // => 0 let token = dogs.observe { changes in switch changes { case .initial(let dogNames): // Will print "dogNames.count: 1" print("dogNames.count: \(dogNames.count)") break case .update: // Will not be hit in this example break case .error: break } } try! realm.write { let dog = Dog() dog.name = "Rex" person.dogs.append(dog) } // end of run loop execution context
키 경로를 지정하지 않으면 모든 객체 속성과 중첩되고 연결된 객체의 속성에 대해 삽입, 수정 또는 삭제할 때 차단이 실행됩니다. 하나 이상의 키 경로가 제공되면 제공된 키 경로에서만 발생하는 변경에 대해 차단이 호출됩니다. 예를 들어 다음과 같은 경우입니다.
class Person: Object { @Persisted var dogs: List<Dog> } class PersonProjection: Projection<Person> { @Projected(\Person.dogs.projectTo.name) var dogNames: ProjectedCollection<String> } // ... let dogNames = personProjection.dogNames let token = dogNames.observe(keyPaths: ["name"]) { changes in switch changes { case .initial(let dogNames): // ... case .update: // This case is hit: // - after the token is initialized // - when the name property of an object in the // collection is modified // - when an element is inserted or removed // from the collection. // This block is not triggered: // - when a value other than name is modified on // one of the elements. case .error: // ... } } // end of run loop execution context
이 컬렉션의
Dog
에 연결된 다른 값을 변경해도 차단이 트리거 되지 않습니다 . 관찰 중인Dog
유형 컬렉션을 삽입하거나 제거해도 알림이 트리거됩니다.참고
별도의 키 경로를 필터링하는 동일한 객체의 여러 알림 토큰은 독점적으로 필터링 되지 않습니다 . 하나의 알림 토큰에 대해 하나의 키 경로 변경이 충족되면 해당 객체에 대한 모든 알림 토큰 차단이 실행됩니다.블록에 업데이트를 전송하려는 한 반환된 토큰을 보관해야 합니다. 업데이트 수신을 중지하려면 토큰에서
invalidate()
을 호출합니다.경고
쓰기 트랜잭션(write transaction) 중에는 또는 포함하는 Realm이 읽기 전용일 때 이 메서드를 호출할 수 없습니다.
선언
스위프트
public func observe(keyPaths: [String]? = nil, on queue: DispatchQueue? = nil, _ block: @escaping (RealmCollectionChange<ProjectedCollection<Element>>) -> Void) -> NotificationToken
매개변수
keyPaths
키 경로 배열에 포함된 속성만 수정 시 trigger가 속성됩니다.
nil
인 경우 객체의 속성 변경에 대한 알림이 전달됩니다. 유효한 속성에 해당하지 않는 문자열 키 경로는 예외를 발생시킵니다. 연결된 속성에 대한 자세한 내용은 위의 설명을 참조하세요.queue
알림을 수신할 직렬 디스패치 대기열입니다.
nil
인 경우 알림이 현재 스레드로 전달됩니다.block
변경이 발생할 때마다 호출되는 차단입니다.
반환 값
업데이트가 전달되기를 원하는 기간 동안 보유해야 하는 토큰입니다.
-
지정된 인덱스에 있는 객체를 반환하거나(get), 지정된 인덱스에 있는 객체를 대체합니다(set).
경고
쓰기 트랜잭션(write transaction) 중에만 객체를 설정할 수 있습니다.
선언
스위프트
public subscript(position: Int) -> Element { get set }
매개변수
index
검색하거나 바꿀 객체의 인덱스입니다.
-
비어 있지 않은 collection에서 첫 번째 요소의 위치입니다. 빈 collection의 endIndex 와 동일합니다.
선언
스위프트
public var startIndex: Int { get }
-
컬렉션의 '끝 이후' 위치입니다. endIndex는 아래 첨자에 대한 유효한 인수가 아니며, 0개 이상의 Successor() 애플리케이션으로 항상 startIndex에서 도달할 수 있습니다.
선언
스위프트
public var endIndex: Int { get }
-
객체를 managed하는 Realm입니다.
선언
스위프트
public var realm: Realm? { get }
-
collection에 더 이상 액세스할 수 없는지 여부를 나타냅니다.
선언
스위프트
public var isInvalidated: Bool { get }
-
사람이 읽을 수 있는 객체에 대한 설명입니다.
선언
스위프트
public var description: String { get }
-
연결 객체에 있는 객체의 인덱스를 반환하거나, 객체가 없는 경우
nil
를 반환합니다.선언
스위프트
public func index(of object: Element) -> Int?
매개변수
object
인덱스를 쿼리 중인 객체입니다.
-
선언
스위프트
public var isFrozen: Bool { get }
-
선언
스위프트
public func freeze() -> ProjectedCollection<Element>
-
선언
스위프트
public func thaw() -> `Self`?