RealmCollection

public protocol RealmCollection : RealmCollectionBase, Equatable where Self.Iterator == RLMIterator<Self.Element>

검색, 필터링, 정렬 및 연산이 가능한 Object의 동질적인 컬렉션입니다.

속성

  • 컬렉션을 관리하는 Realm이거나 관리되지 않는 컬렉션의 경우 nil 입니다.

    선언

    스위프트

    var realm: Realm? { get }
  • collection에 더 이상 액세스할 수 없는지 여부를 나타냅니다.

    collection을 managed하는 Realm 에서 invalidate() 가 호출된 경우 collection에 더 이상 액세스할 수 없습니다.

    선언

    스위프트

    var isInvalidated: Bool { get }
  • collection의 객체 수입니다.

    선언

    스위프트

    var count: Int { get }
  • collection에 포함된 객체에 대한 사람이 읽을 수 있는 설명입니다.

    선언

    스위프트

    var description: String { get }

객체 조회

  • collection의 첫 번째 객체를 반환하거나 collection이 비어 있는 경우 nil 을 반환합니다.

    선언

    스위프트

    var first: Element? { get }
  • collection의 마지막 객체를 반환하거나 collection이 비어 있는 경우 nil 을 반환합니다.

    선언

    스위프트

    var last: Element? { get }

인덱스 검색

  • collection에 있는 객체의 인덱스를 반환하거나, 객체가 없는 경우 nil 을 반환합니다.

    선언

    스위프트

    func index(of object: Element) -> Int?

    매개변수

    object

    객체입니다.

  • index(matching:) 기본 구현

    조건자와 일치하는 첫 번째 객체의 인덱스를 반환하거나, 일치하는 객체가 없는 경우 nil 를 반환합니다.

    이는 정렬된 collection에만 적용되며 collection이 정렬되지 않으면 중단됩니다.

    기본 구현

    쿼리와 일치하는 첫 번째 객체의 인덱스를 반환하거나, 일치하는 객체가 없는 경우 nil 을 반환합니다.

    이는 정렬된 collection에만 적용되며 collection이 정렬되지 않으면 중단됩니다.

    참고

    이는 @Persistable 속성 선언을 사용하는 클래스에만 사용해야 합니다.

    • 사용법:

      obj.index(matching: { $0.fooCol < 456 })
      

    참고

    사용 가능한 쿼리 작업에 대한 자세한 내용은 Query 를 참조하세요.

    선언

    스위프트

    func index(matching predicate: NSPredicate) -> Int?

    매개변수

    predicate

    객체를 필터링하는 데 사용할 조건자입니다.

  • index(matching:_:) 기본 구현

    조건자와 일치하는 첫 번째 객체의 인덱스를 반환하거나, 일치하는 객체가 없는 경우 nil 를 반환합니다.

    이는 정렬된 collection에만 적용되며 collection이 정렬되지 않으면 중단됩니다.

    기본 구현

    지정된 조건자와 일치하는 첫 번째 객체의 인덱스를 반환하거나 일치하는 객체가 없는 경우 nil 를 반환합니다.

    선언

    스위프트

    func index(matching predicateFormat: String, _ args: Any...) -> Int?

    매개변수

    predicateFormat

    조건자 형식 문자열이며, 선택적으로 그 뒤에 다양한 수의 인수가 옵니다.

객체 조회

  • 주어진 인덱스 세트로 지정된 인덱스에 collection의 객체를 포함하는 배열을 반환합니다.

    경고

    IndexSet에 제공된 인덱스가 범위를 벗어나면 예외가 발생합니다.

    선언

    스위프트

    func objects(at indexes: IndexSet) -> [Element]

    매개변수

    indexes

    객체를 선택할 collection의 인덱스입니다.

필터링

  • filter(_:_:) 기본 구현

    컬렉션에서 지정된 조건자와 일치하는 모든 객체를 포함하는 Results 를 반환합니다.

    기본 구현

    컬렉션에서 지정된 조건자와 일치하는 모든 객체를 포함하는 Results 를 반환합니다.

    선언

    스위프트

    func filter(_ predicateFormat: String, _ args: Any...) -> Results<Element>

    매개변수

    predicateFormat

    조건자 형식 문자열이며, 선택적으로 그 뒤에 다양한 수의 인수가 옵니다.

  • 컬렉션에서 지정된 조건자와 일치하는 모든 객체를 포함하는 Results 를 반환합니다.

    선언

    스위프트

    func filter(_ predicate: NSPredicate) -> Results<Element>

    매개변수

    predicate

    객체를 필터링하는 데 사용할 조건자입니다.

정렬

  • collection에 있지만 정렬된 객체를 포함하는 Results 을 반환합니다.

    경고

    collection은 부울, Date, NSDate, 단일 및 배정밀도 부동 소수점, 정수, 문자열 유형의 속성을 통해서만 정렬할 수 있습니다.

    ~를 참조하세요.

    sorted(byKeyPath:ascending:)

    선언

    스위프트

    func sorted<S>(by sortDescriptors: S) -> Results<Element> where S : Sequence, S.Element == SortDescriptor

    매개변수

    sortDescriptors

    정렬 기준이 되는 SortDescriptor의 시퀀스입니다.

  • 지정된 키 경로를 기반으로 고유 객체를 포함하는 Results 를 반환합니다.

    선언

    스위프트

    func distinct<S>(by keyPaths: S) -> Results<Element> where S : Sequence, S.Element == String

    매개변수

    keyPaths

    구분할 키 경로입니다.

집계 작업

  • collection의 모든 객체 중 지정된 속성의 최소값(최저)을 반환하거나 collection이 비어 있는 경우 nil 를 반환합니다.

    경고

    유형이 MinMaxType 프로토콜을 준수하는 속성만 지정할 수 있습니다.

    선언

    스위프트

    func min<T>(ofProperty property: String) -> T? where T : _HasPersistedType, T.PersistedType : MinMaxType

    매개변수

    property

    최소값을 원하는 속성의 이름입니다.

  • 컬렉션의 모든 객체 중 지정된 속성의 최대값(가장 높은 값)을 반환하거나, 컬렉션이 비어 있는 경우 nil 를 반환합니다.

    경고

    유형이 MinMaxType 프로토콜을 준수하는 속성만 지정할 수 있습니다.

    선언

    스위프트

    func max<T>(ofProperty property: String) -> T? where T : _HasPersistedType, T.PersistedType : MinMaxType

    매개변수

    property

    최소값을 원하는 속성의 이름입니다.

  • collection에 있는 객체에 지정된 속성의 합계를 반환하거나 collection이 비어 있는 경우 nil 를 반환합니다.

    경고

    AddableType 프로토콜을 준수하는 유형의 속성 이름만 사용할 수 있습니다.

    선언

    스위프트

    func sum<T>(ofProperty property: String) -> T where T : _HasPersistedType, T.PersistedType : AddableType

    매개변수

    property

    합계를 계산할 AddableType 을(를) 준수하는 속성의 이름입니다.

  • collection의 모든 객체에 대한 지정된 속성의 평균값을 반환하거나 collection이 비어 있는 경우 nil 를 반환합니다.

    경고

    유형이 AddableType 프로토콜을 준수하는 속성만 지정할 수 있습니다.

    선언

    스위프트

    func average<T>(ofProperty property: String) -> T? where T : _HasPersistedType, T.PersistedType : AddableType

    매개변수

    property

    값을 합산해야 하는 속성의 이름입니다.

키-값 코딩

  • 컬렉션의 각 객체에 대해 keyvalueForKey(_:) 를 호출한 결과가 포함된 Array 을 반환합니다.

    선언

    스위프트

    func value(forKey key: String) -> Any?

    매개변수

    key

    값을 원하는 속성의 이름입니다.

  • 컬렉션의 각 객체에 대해 keyPathvalueForKeyPath(_:) 를 호출한 결과가 포함된 Array 을 반환합니다.

    선언

    스위프트

    func value(forKeyPath keyPath: String) -> Any?

    매개변수

    keyPath

    값을 원하는 속성의 키 경로입니다.

  • 지정된 valuekey 를 사용하여 컬렉션의 각 객체에 대해 setValue(_:forKey:) 을(를) 호출합니다.

    경고

    이 메서드는 쓰기 트랜잭션(write transaction) 중에만 호출할 수 있습니다.

    선언

    스위프트

    func setValue(_ value: Any?, forKey key: String)

    매개변수

    value

    객체 값입니다.

    key

    각 객체에 값을 설정해야 하는 속성의 이름입니다.

알림

  • observe(keyPaths:on:_:) 기본 구현

    collection이 변경될 때마다 호출될 블록을 등록합니다.

    블록은 초기 결과와 함께 비동기적으로 호출된 다음 컬렉션의 객체 또는 컬렉션에 있는 객체를 변경하는 각 쓰기 트랜잭션(write transaction) 후에 다시 호출됩니다.

    블록에 전달되는 change 매개변수는 각 쓰기 트랜잭션(write transaction) 중에 추가, 제거 또는 수정된 객체를 collection 내에서 인덱스 형식으로 보고합니다. 제공된 변경 정보에 대한 자세한 내용과 이를 사용하여 UITableView 을 업데이트하는 방법에 대한 예는 RealmCollectionChange 문서를 참조하세요.

    차단이 호출되는 시점에 collection은 완전히 평가되고 최신 상태이므로 동일한 스레드에서 쓰기 트랜잭션 (write transaction)을 수행하지 않거나 명시적으로 realm.refresh() 호출하지 않는 한 해당 스레드에 액세스하면 차단이 수행되지 않습니다. 일.

    대기열이 제공되지 않으면 표준 이벤트 루프를 통해 알림이 전달되므로 이벤트 루프가 다른 활동에 의해 차단되는 동안에는 알림을 전달할 수 없습니다. 대기열이 제공되면 대신 해당 대기열로 알림이 전달됩니다. 알림을 즉시 전달할 수 없는 경우 여러 알림이 단일 알림으로 병합될 수 있습니다. 여기에는 초기 collection에 대한 알림이 포함될 수 있습니다.

    예를 들어 다음 코드는 알림 차단을 추가한 직후 쓰기 트랜잭션(write transaction)을 수행하므로 초기 알림이 먼저 전달될 기회가 없습니다. 결과적으로 초기 알림에는 쓰기 트랜잭션(write transaction) 후 Realm의 상태가 반영됩니다.

    let dogs = realm.objects(Dog.self)
    print("dogs.count: \(dogs?.count)") // => 0
    let token = dogs.observe { changes in
        switch changes {
        case .initial(let dogs):
            // Will print "dogs.count: 1"
            print("dogs.count: \(dogs.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 Dog: Object {
        @Persisted var name: String
        @Persisted var age: Int
        @Persisted var toys: List<Toy>
    }
    // ...
    let dogs = realm.objects(Dog.self)
    
    let token = dogs.observe(keyPaths: ["name"]) { changes in
        switch changes {
        case .initial(let dogs):
           // ...
        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
    
    • 관찰된 키 경로가 ["toys.brand"] 인 경우 collection 요소의 toys 목록을 삽입하거나 삭제하면 trigger 됩니다. 이 collection의 Dog 에 연결된 Toybrand 값을 변경하면 차단이 trigger됩니다. 이 collection의 Dog 에 연결된 Toy 에서 brand 이외의 값을 변경해도 차단이 trigger되지 않습니다. 관찰 중인 Dog 유형 collection을 삽입하거나 제거하면 trigger 알림이 됩니다.
    • 위의 예에서 ["toys"] 키 경로를 관찰한 경우 collection의 모든 요소에 대한 toys 목록을 삽입, 삭제 또는 수정하면 trigger가 됩니다. 이 컬렉션의 Dog 에 연결된 Toy 의 값을 변경해도 차단이 트리거 되지 않습니다 . 관찰 중인 Dog 유형 collection을 삽입하거나 제거해도 알림이 trigger됩니다.

    참고

    별도의 키 경로를 필터링하는 동일한 객체의 여러 알림 토큰은 독점적으로 필터링 되지 않습니다 . 하나의 알림 토큰에 대해 하나의 키 경로 변경이 충족되면 해당 객체에 대한 모든 알림 토큰 차단이 실행됩니다.

    블록에 업데이트를 전송하려는 한 반환된 토큰을 보관해야 합니다. 업데이트 수신을 중지하려면 토큰에서 invalidate() 을 호출합니다.

    경고

    쓰기 트랜잭션(write transaction) 중에는 또는 포함하는 Realm이 읽기 전용일 때 이 메서드를 호출할 수 없습니다.

    기본 구현

    collection이 변경될 때마다 호출될 블록을 등록합니다.

    블록은 초기 결과와 함께 비동기적으로 호출된 다음 컬렉션의 객체 또는 컬렉션에 있는 객체를 변경하는 각 쓰기 트랜잭션(write transaction) 후에 다시 호출됩니다.

    블록에 전달되는 change 매개변수는 각 쓰기 트랜잭션(write transaction) 중에 추가, 제거 또는 수정된 객체를 collection 내에서 인덱스 형식으로 보고합니다. 제공된 변경 정보에 대한 자세한 내용과 이를 사용하여 UITableView 을 업데이트하는 방법에 대한 예는 RealmCollectionChange 문서를 참조하세요.

    차단이 호출되는 시점에 collection은 완전히 평가되고 최신 상태이므로 동일한 스레드에서 쓰기 트랜잭션 (write transaction)을 수행하지 않거나 명시적으로 realm.refresh() 호출하지 않는 한 해당 스레드에 액세스하면 차단이 수행되지 않습니다. 일.

    대기열이 제공되지 않으면 표준 이벤트 루프를 통해 알림이 전달되므로 이벤트 루프가 다른 활동에 의해 차단되는 동안에는 알림을 전달할 수 없습니다. 대기열이 제공되면 대신 해당 대기열로 알림이 전달됩니다. 알림을 즉시 전달할 수 없는 경우 여러 알림이 단일 알림으로 병합될 수 있습니다. 여기에는 초기 collection에 대한 알림이 포함될 수 있습니다.

    예를 들어 다음 코드는 알림 차단을 추가한 직후 쓰기 트랜잭션(write transaction)을 수행하므로 초기 알림이 먼저 전달될 기회가 없습니다. 결과적으로 초기 알림에는 쓰기 트랜잭션(write transaction) 후 Realm의 상태가 반영됩니다.

    let dogs = realm.objects(Dog.self)
    print("dogs.count: \(dogs?.count)") // => 0
    let token = dogs.observe { changes in
        switch changes {
        case .initial(let dogs):
            // Will print "dogs.count: 1"
            print("dogs.count: \(dogs.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 Dog: Object {
        @Persisted var name: String
        @Persisted var age: Int
        @Persisted var toys: List<Toy>
    }
    // ...
    let dogs = realm.objects(Dog.self)
    
    let token = dogs.observe(keyPaths: [\Dog.name]) { changes in
        switch changes {
        case .initial(let dogs):
           // ...
        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.toys.brand] 인 경우 collection 요소의 toys 목록을 삽입하거나 삭제하면 trigger 됩니다. 이 collection의 Dog 에 연결된 Toybrand 값을 변경하면 차단이 trigger됩니다. 이 collection의 Dog 에 연결된 Toy 에서 brand 이외의 값을 변경해도 차단이 trigger되지 않습니다. 관찰 중인 Dog 유형 collection을 삽입하거나 제거하면 trigger 알림이 됩니다.
    • 위의 예에서 [\Dog.toys] 키 경로를 관찰한 경우 collection의 모든 요소에 대한 toys 목록을 삽입, 삭제 또는 수정하면 trigger가 됩니다. 이 컬렉션의 Dog 에 연결된 Toy 의 값을 변경해도 차단이 트리거 되지 않습니다 . 관찰 중인 Dog 유형 collection을 삽입하거나 제거해도 알림이 trigger됩니다.

    참고

    별도의 키 경로를 필터링하는 동일한 객체의 여러 알림 토큰은 독점적으로 필터링 되지 않습니다 . 하나의 알림 토큰에 대해 하나의 키 경로 변경이 충족되면 해당 객체에 대한 모든 알림 토큰 차단이 실행됩니다.

    블록에 업데이트를 전송하려는 한 반환된 토큰을 보관해야 합니다. 업데이트 수신을 중지하려면 토큰에서 invalidate() 을 호출합니다.

    경고

    쓰기 트랜잭션(write transaction) 중에는 또는 포함하는 Realm이 읽기 전용일 때 이 메서드를 호출할 수 없습니다.

    선언

    스위프트

    func observe(keyPaths: [String]?,
                 on queue: DispatchQueue?,
                 _ block: @escaping (RealmCollectionChange<Self>) -> Void) -> NotificationToken

    매개변수

    keyPaths

    키 경로 배열에 포함된 속성만 수정 시 trigger가 속성됩니다. nil 인 경우 객체의 속성 변경에 대한 알림이 전달됩니다. 유효한 속성에 해당하지 않는 문자열 키 경로는 예외를 발생시킵니다. 연결된 속성에 대한 자세한 내용은 위의 설명을 참조하세요.

    queue

    알림을 수신할 직렬 디스패치 대기열입니다. nil 인 경우 알림이 현재 스레드로 전달됩니다.

    block

    변경이 발생할 때마다 호출되는 차단입니다.

    반환 값

    업데이트가 전달되기를 원하는 기간 동안 보유해야 하는 토큰입니다.

  • observe(keyPaths:on:_:) 기본 구현, 비동기

    collection이 변경될 때마다 호출될 블록을 등록합니다.

    블록은 collection의 초기 버전과 함께 비동기적으로 호출된 다음, collection의 객체 또는 collection에 있는 객체를 변경하는 각 쓰기 트랜잭션 (write transaction) 후에 다시 호출됩니다.

    차단에 전달된 actor 매개변수는 이 함수에 전달되는 행위자입니다. 이 매개변수는 콜백을 행위자에 격리하는 데 필요합니다.

    차단에 전달되는 change 매개변수는 collection 내에서 이전 알림 이후에 추가, 제거 또는 수정된 객체를 인덱스 형식으로 보고합니다. 변경 열거형의 collection 필드는 요청된 행위자로 격리되며 해당 행위자 내에서만 사용해도 안전합니다. 제공된 변경 정보에 대한 자세한 내용과 이를 사용하여 UITableView 을 업데이트하는 방법에 대한 예는 RealmCollectionChange 문서를 참조하세요.

    초기 알림이 전달되면 collection이 완전히 평가되어 최신 상태로 유지되며 collection에 액세스할 때 차단 작업을 수행하지 않습니다. 이 보장은 알림이 전달되는 동일한 행위자에 대해 쓰기 트랜잭션(write transaction)을 수행하지 않는 경우에만 적용됩니다. 이 경우 다음 알림이 전달되기 전에 collection에 액세스하려면 쿼리를 다시 실행해야 할 수 있습니다.

    알림은 지정된 행위자의 실행기로 전달됩니다. 알림을 즉시 전달할 수 없는 경우 여러 알림이 단일 알림으로 병합될 수 있습니다. 여기에는 초기 collection과의 알림이 포함될 수 있습니다. 초기 알림이 전달되기 전에 발생하는 쓰기는 변경 알림을 생성하지 않을 수 있습니다.

    collection에서 객체를 추가, 제거 또는 할당하면 항상 알림이 생성됩니다. 기본적으로, collection이 연결되는 객체(및 해당하는 경우 해당 객체가 연결되는 객체)를 수정하면, collection의 해당 인덱스가 수정 중인 것으로 보고됩니다. 비어 있지 않은 키 경로 배열이 제공되는 경우 해당 키 경로를 수정해야만 객체가 수정된 것으로 표시됩니다. 예를 들면 다음과 같습니다.

    class Dog: Object {
        @Persisted var name: String
        @Persisted var age: Int
        @Persisted var toys: List<Toy>
    }
    
    let dogs = realm.objects(Dog.self)
    let token = await dogs.observe(keyPaths: ["name"], on: myActor) { actor, changes in
        switch changes {
        case .initial(let dogs):
            // Query has finished running and dogs can not be used without blocking
        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:
            // Can no longer happen but is left for backwards compatiblity
        }
    }
    
    • 관찰된 키 경로가 ["toys.brand"] 인 경우 collection 요소의 toys 목록을 삽입하거나 삭제하면 trigger 됩니다. 이 collection의 Dog 에 연결된 Toybrand 값을 변경하면 차단이 trigger됩니다. 이 collection의 Dog 에 연결된 Toy 에서 brand 이외의 값을 변경해도 차단이 trigger되지 않습니다. 관찰 중인 Dog 유형 collection을 삽입하거나 제거하면 trigger 알림이 됩니다.
    • 위의 예에서 ["toys"] 키 경로를 관찰한 경우 collection의 모든 요소에 대한 toys 목록을 삽입, 삭제 또는 수정하면 trigger가 됩니다. 이 컬렉션의 Dog 에 연결된 Toy 의 값을 변경해도 차단이 트리거 되지 않습니다 . 관찰 중인 Dog 유형 collection을 삽입하거나 제거해도 알림이 trigger됩니다.

    블록에 업데이트를 전송하려는 한 반환된 토큰을 보관해야 합니다. 업데이트 수신을 중지하려면 토큰에서 invalidate() 을 호출합니다.

    경고

    쓰기 트랜잭션(write transaction) 중에는 또는 포함하는 Realm이 읽기 전용일 때 이 메서드를 호출할 수 없습니다.

    기본 구현

    collection이 변경될 때마다 호출될 블록을 등록합니다.

    블록은 collection의 초기 버전과 함께 비동기적으로 호출된 다음, collection의 객체 또는 collection에 있는 객체를 변경하는 각 쓰기 트랜잭션 (write transaction) 후에 다시 호출됩니다.

    차단에 전달된 actor 매개변수는 이 함수에 전달되는 행위자입니다. 이 매개변수는 콜백을 행위자에 격리하는 데 필요합니다.

    차단에 전달되는 change 매개변수는 collection 내에서 이전 알림 이후에 추가, 제거 또는 수정된 객체를 인덱스 형식으로 보고합니다. 변경 열거형의 collection 필드는 요청된 행위자로 격리되며 해당 행위자 내에서만 사용해도 안전합니다. 제공된 변경 정보에 대한 자세한 내용과 이를 사용하여 UITableView 을 업데이트하는 방법에 대한 예는 RealmCollectionChange 문서를 참조하세요.

    초기 알림이 전달되면 collection이 완전히 평가되어 최신 상태로 유지되며 collection에 액세스할 때 차단 작업을 수행하지 않습니다. 이 보장은 알림이 전달되는 동일한 행위자에 대해 쓰기 트랜잭션(write transaction)을 수행하지 않는 경우에만 적용됩니다. 이 경우 다음 알림이 전달되기 전에 collection에 액세스하려면 쿼리를 다시 실행해야 할 수 있습니다.

    알림은 지정된 행위자의 실행기로 전달됩니다. 알림을 즉시 전달할 수 없는 경우 여러 알림이 단일 알림으로 병합될 수 있습니다. 여기에는 초기 collection과의 알림이 포함될 수 있습니다. 초기 알림이 전달되기 전에 발생하는 쓰기는 변경 알림을 생성하지 않을 수 있습니다.

    collection에서 객체를 추가, 제거 또는 할당하면 항상 알림이 생성됩니다. 기본적으로, collection이 연결되는 객체(및 해당하는 경우 해당 객체가 연결되는 객체)를 수정하면, collection의 해당 인덱스가 수정 중인 것으로 보고됩니다. 비어 있지 않은 키 경로 배열이 제공되는 경우 해당 키 경로를 수정해야만 객체가 수정된 것으로 표시됩니다. 예를 들면 다음과 같습니다.

    class Dog: Object {
        @Persisted var name: String
        @Persisted var age: Int
        @Persisted var toys: List<Toy>
    }
    
    let dogs = realm.objects(Dog.self)
    let token = await dogs.observe(keyPaths: ["name"], on: myActor) { actor, changes in
        switch changes {
        case .initial(let dogs):
            // Query has finished running and dogs can not be used without blocking
        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:
            // Can no longer happen but is left for backwards compatiblity
        }
    }
    
    • 관찰된 키 경로가 ["toys.brand"] 인 경우 collection 요소의 toys 목록을 삽입하거나 삭제하면 trigger 됩니다. 이 collection의 Dog 에 연결된 Toybrand 값을 변경하면 차단이 trigger됩니다. 이 collection의 Dog 에 연결된 Toy 에서 brand 이외의 값을 변경해도 차단이 trigger되지 않습니다. 관찰 중인 Dog 유형 collection을 삽입하거나 제거하면 trigger 알림이 됩니다.
    • 위의 예에서 ["toys"] 키 경로를 관찰한 경우 collection의 모든 요소에 대한 toys 목록을 삽입, 삭제 또는 수정하면 trigger가 됩니다. 이 컬렉션의 Dog 에 연결된 Toy 의 값을 변경해도 차단이 트리거 되지 않습니다 . 관찰 중인 Dog 유형 collection을 삽입하거나 제거해도 알림이 trigger됩니다.

    블록에 업데이트를 전송하려는 한 반환된 토큰을 보관해야 합니다. 업데이트 수신을 중지하려면 토큰에서 invalidate() 을 호출합니다.

    경고

    쓰기 트랜잭션(write transaction) 중에는 또는 포함하는 Realm이 읽기 전용일 때 이 메서드를 호출할 수 없습니다.

    선언

    스위프트

    @available(macOS 10.15, tvOS 13.0, iOS 13.0, watchOS 6.0, *)
    @_unsafeInheritExecutor
    func observe<A: Actor>(keyPaths: [String]?,
                           on actor: A,
                           _ block: @Sendable @escaping (isolated A, RealmCollectionChange<Self>) -> Void) async -> NotificationToken

    매개변수

    keyPaths

    키 경로 배열에 포함된 속성만 수정 시 trigger가 속성됩니다. nil 이거나 비어 있으면 객체의 속성 변경에 대한 알림이 전달됩니다. 유효한 속성에 해당하지 않는 문자열 키 경로는 예외를 발생시킵니다. 연결된 속성에 대한 자세한 내용은 위의 설명을 참조하세요.

    actor

    알림을 격리할 행위자입니다.

    block

    변경이 발생할 때마다 호출되는 차단입니다.

    반환 값

    업데이트가 전달되기를 원하는 기간 동안 보유해야 하는 토큰입니다.

동결된 객체

  • 이 collection이 동결되면 true를 반환합니다.

    선언

    스위프트

    var isFrozen: Bool { get }
  • 이 collection의 동결(불변) 스냅샷을 반환합니다.

    동결 사본은 변경이 불가능한 collection으로 이 collection이 현재 포함하고 있는 것과 동일한 데이터를 포함하지만 포함 Realm에 기록할 때 업데이트되지 않습니다. 라이브 collection과 달리 동결 collection은 모든 스레드에서 액세스할 수 있습니다.

    경고

    쓰기 트랜잭션(write transaction) 중에는 또는 포함하는 Realm이 읽기 전용일 때 이 메서드를 호출할 수 없습니다.

    경고

    Realm에서 쓰기 트랜잭션(write transaction)을 수행하는 동안 동결된 컬렉션을 오랫동안 유지하면 Realm 파일 크기가 커질 수 있습니다. 자세한 내용은 Realm.Configuration.maximumNumberOfActiveVersions 를 참조하세요.

    선언

    스위프트

    func freeze() -> Self
  • 이 동결 collection의 라이브(변경 가능) 버전을 반환합니다.

    이 메서드는 동일한 동결 컬렉션의 라이브 사본에 대한 참조를 확인합니다. 라이브 컬렉션에서 호출하면 자체를 반환합니다.

    선언

    스위프트

    func thaw() -> Self?
  • 지정된 정렬 설명자 배열에서 이 collection을 정렬하고 콜백을 통해 섹션을 수행하여 결과를 인스턴스 SectionedResults로 반환합니다.

    참고

    프라이머리 정렬 설명자는 섹션 키 결정을 담당해야 합니다.

    선언

    스위프트

    func sectioned<Key: _Persistable>(sortDescriptors: [SortDescriptor],
                                      _ keyBlock: @escaping ((Element) -> Key)) -> SectionedResults<Key, Element>

    매개변수

    sortDescriptors

    정렬 기준이 되는 SortDescriptor의 배열입니다.

    keyBlock

    Results collection의 각 요소에 대해 호출되는 콜백입니다. 이 콜백은 collection에 있는 요소의 섹션 키를 반환하는 것입니다.

    반환 값

    SectionedResults 의 인스턴스입니다.

유형 안전 쿼리

  • where(_:) 확장 메서드

    컬렉션의 지정된 쿼리와 일치하는 모든 객체를 포함하는 Results 를 반환합니다.

    참고

    이는 @Persistable 속성 선언을 사용하는 클래스에만 사용해야 합니다.

    • 사용법:

      myCol.where {
      ($0.fooCol > 5) && ($0.barCol == "foobar")
      }
      

    참고

    사용 가능한 쿼리 작업에 대한 자세한 내용은 Query 를 참조하세요.

    선언

    스위프트

    func `where`(_ isIncluded: ((Query<Element>) -> Query<Bool>)) -> Results<Element>

    매개변수

    isIncluded

    객체를 필터링하는 데 사용할 쿼리 클로저입니다.

collection 프로토콜

  • startIndex 확장 메서드

    비어 있지 않은 collection에서 첫 번째 요소의 위치입니다. 빈 collection의 endIndex 와 동일합니다.

    선언

    스위프트

    var startIndex: Int { get }
  • endIndex 확장 메서드

    컬렉션의 '끝 이후' 위치입니다. endIndex는 아래 첨자에 대한 유효한 인수가 아니며, 0개 이상의 Successor() 애플리케이션으로 항상 startIndex에서 도달할 수 있습니다.

    선언

    스위프트

    var endIndex: Int { get }
  • index(after:) 확장 메서드

    지정된 인덱스 바로 뒤의 위치를 반환합니다.

    선언

    스위프트

    func index(after i: Int) -> Int

    매개변수

    i

    collection의 유효한 인덱스입니다. iendIndex 보다 작아야 합니다.

  • index(before:) 확장 메서드

    지정된 인덱스 바로 앞의 위치를 반환합니다.

    선언

    스위프트

    func index(before i: Int) -> Int

    매개변수

    i

    collection의 유효한 인덱스입니다. istartIndex 보다 커야 합니다.

기본 요소의 섹션화된 결과

  • sectioned(by:ascending:) 확장 메서드

    이 collection을 오름차순 또는 내림차순으로 정렬하고 사용자 정의 콜백 함수를 통해 섹션을 수행합니다.

    선언

    스위프트

    func sectioned<Key: _Persistable>(by block: @escaping ((Element) -> Key),
                                      ascending: Bool = true) -> SectionedResults<Key, Element>

    매개변수

    block

    컬렉션의 각 요소에서 호출되는 콜백입니다. 이 콜백은 컬렉션에 있는 요소의 섹션 키를 반환하는 것입니다.

    ascending

    정렬할 방향입니다.

    반환 값

    SectionedResults 의 인스턴스입니다.

관찰

  • sectioned(by:ascending:) 확장 메서드

    지정된 속성 키 경로에서 이 collection을 정렬 및 섹션화하여 결과를 인스턴스로 SectionedResults 반환합니다. keyPath에서 검색된 모든 고유 값에 대해 섹션 키가 생성됩니다.

    선언

    스위프트

    public func sectioned<Key: _Persistable, O: ObjectBase>(by keyPath: KeyPath<Element, Key>,
                                                            ascending: Bool = true) -> SectionedResults<Key, Element> where Element: Projection<O>

    매개변수

    keyPath

    정렬할 속성 키 경로입니다.

    ascending

    정렬할 방향입니다.

    반환 값

    SectionedResults 의 인스턴스입니다.

  • 지정된 속성 키 경로에서 이 collection을 정렬 및 섹션화하여 결과를 인스턴스로 SectionedResults 반환합니다. keyPath에서 검색된 모든 고유 값에 대해 섹션 키가 생성됩니다.

    참고

    프라이머리 정렬 설명자는 섹션 키 결정을 담당해야 합니다.

    선언

    스위프트

    public func sectioned<Key: _Persistable, O: ObjectBase>(by keyPath: KeyPath<Element, Key>,
                                                            sortDescriptors: [SortDescriptor]) -> SectionedResults<Key, Element> where Element: Projection<O>

    매개변수

    keyPath

    정렬할 속성 키 경로입니다.

    sortDescriptors

    정렬 기준이 되는 SortDescriptor의 배열입니다.

    반환 값

    SectionedResults 의 인스턴스입니다.

  • 지정된 정렬 설명자 배열에서 이 collection을 정렬하고 사용자 정의 콜백에서 섹션을 수행하여 결과를 SectionedResults 인스턴스로 반환합니다.

    참고

    프라이머리 정렬 설명자는 섹션 키 결정을 담당해야 합니다.

    선언

    스위프트

    public func sectioned<Key: _Persistable, O: ObjectBase>(by block: @escaping ((Element) -> Key),
                                                            sortDescriptors: [SortDescriptor]) -> SectionedResults<Key, Element> where Element: Projection<O>

    매개변수

    block

    Results collection의 각 요소에 대해 호출되는 콜백입니다. 이 콜백은 collection에 있는 요소의 섹션 키를 반환하는 것입니다.

    sortDescriptors

    정렬 기준이 되는 SortDescriptor의 배열입니다.

    반환 값

    SectionedResults 의 인스턴스입니다.

Self: RealmSubscribable에서 사용 가능

  • objectWillChange 확장 메서드

    collection이 변경될 때마다 Void를 방출하는 출판사입니다.

    이름과 달리 실제로 collection 변경된 후에 방출합니다.

    선언

    스위프트

    public var objectWillChange: RealmPublishers.WillChange<Self> { get }
  • collectionPublisher 확장 메서드

    컬렉션이 변경될 때마다 컬렉션을 방출하는 출판사입니다.

    선언

    스위프트

    public var collectionPublisher: RealmPublishers.Value<Self> { get }
  • 지정된 속성 keyPaths에서 컬렉션이 변경될 때마다 컬렉션을 내보내는 출판사입니다.

    선언

    스위프트

    public func collectionPublisher(keyPaths: [String]?) -> RealmPublishers.Value<Self>
  • changesetPublisher 확장 메서드

    컬렉션이 변경될 때마다 컬렉션 변경 집합을 내보내는 출판사입니다.

    선언

    스위프트

    public var changesetPublisher: RealmPublishers.CollectionChangeset<Self> { get }
  • 지정된 속성 keyPaths에서 컬렉션이 변경될 때마다 컬렉션 변경 집합을 내보내는 출판사입니다.

    선언

    스위프트

    public func changesetPublisher(keyPaths: [String]?) -> RealmPublishers.CollectionChangeset<Self>

Element: Encodable에서 사용 가능

  • encode(to:) 확장 메서드

    이 collection의 콘텐츠를 지정된 인코더에 인코딩합니다.

    선언

    스위프트

    public func encode(to encoder: Encoder) throws

Element: ObjectBase에서 사용 가능

  • min(of:) 확장 메서드

    collection의 모든 객체 중 지정된 속성의 최소값(최저)을 반환하거나 collection이 비어 있는 경우 nil 를 반환합니다.

    경고

    유형이 MinMaxType 프로토콜을 준수하는 속성만 지정할 수 있습니다.

    선언

    스위프트

    func min<T>(of keyPath: KeyPath<Element, T>) -> T? where T : _HasPersistedType, T.PersistedType : MinMaxType

    매개변수

    keyPath

    최소값을 원하는 속성의 keyPath입니다.

  • max(of:) 확장 메서드

    컬렉션의 모든 객체 중 지정된 속성의 최대값(가장 높은 값)을 반환하거나, 컬렉션이 비어 있는 경우 nil 를 반환합니다.

    경고

    유형이 MinMaxType 프로토콜을 준수하는 속성만 지정할 수 있습니다.

    선언

    스위프트

    func max<T>(of keyPath: KeyPath<Element, T>) -> T? where T : _HasPersistedType, T.PersistedType : MinMaxType

    매개변수

    keyPath

    최소값을 원하는 속성의 keyPath입니다.

  • sum(of:) 확장 메서드

    collection에 있는 객체에 지정된 속성의 합계를 반환하거나 collection이 비어 있는 경우 nil 를 반환합니다.

    경고

    AddableType 프로토콜을 준수하는 유형의 속성 이름만 사용할 수 있습니다.

    선언

    스위프트

    func sum<T>(of keyPath: KeyPath<Element, T>) -> T where T : _HasPersistedType, T.PersistedType : AddableType

    매개변수

    keyPath

    합계를 계산할 AddableType 을(를) 준수하는 속성의 keyPath입니다.

  • average(of:) 확장 메서드

    collection의 모든 객체에 대한 지정된 속성의 평균값을 반환하거나 collection이 비어 있는 경우 nil 를 반환합니다.

    경고

    유형이 AddableType 프로토콜을 준수하는 속성만 지정할 수 있습니다.

    선언

    스위프트

    func average<T>(of keyPath: KeyPath<Element, T>) -> T? where T : _HasPersistedType, T.PersistedType : AddableType

    매개변수

    keyPath

    값을 합산해야 하는 속성의 keyPath입니다.

  • sectioned(by:ascending:) 확장 메서드

    지정된 속성 키 경로에서 이 collection을 정렬 및 섹션화하여 결과를 인스턴스로 SectionedResults 반환합니다. keyPath에서 검색된 모든 고유 값에 대해 섹션 키가 생성됩니다.

    선언

    스위프트

    func sectioned<Key: _Persistable>(by keyPath: KeyPath<Element, Key>,
                                      ascending: Bool = true) -> SectionedResults<Key, Element> where Element: ObjectBase

    매개변수

    keyPath

    정렬 및 섹션할 속성 키 경로입니다.

    ascending

    정렬할 방향입니다.

    반환 값

    SectionedResults 의 인스턴스입니다.

  • 지정된 속성 키 경로에서 이 collection을 정렬 및 섹션화하여 결과를 인스턴스로 SectionedResults 반환합니다. keyPath에서 검색된 모든 고유 값에 대해 섹션 키가 생성됩니다.

    참고

    프라이머리 정렬 설명자는 섹션 키 결정을 담당해야 합니다.

    선언

    스위프트

    func sectioned<Key: _Persistable>(by keyPath: KeyPath<Element, Key>,
                                      sortDescriptors: [SortDescriptor]) -> SectionedResults<Key, Element> where Element: ObjectBase

    매개변수

    keyPath

    정렬 및 섹션할 속성 키 경로입니다.

    sortDescriptors

    정렬 기준이 되는 SortDescriptor의 배열입니다.

    반환 값

    SectionedResults 의 인스턴스입니다.

  • 지정된 SortDescriptor배열에서 이 collection을 정렬하고 사용자 정의 콜백 함수를 통해 섹션을 수행합니다.

    참고

    프라이머리 정렬 설명자는 섹션 키 결정을 담당해야 합니다.

    선언

    스위프트

    func sectioned<Key: _Persistable>(by block: @escaping ((Element) -> Key),
                                      sortDescriptors: [SortDescriptor]) -> SectionedResults<Key, Element> where Element: ObjectBase

    매개변수

    block

    컬렉션의 각 요소에서 호출되는 콜백입니다. 이 콜백은 컬렉션에 있는 요소의 섹션 키를 반환하는 것입니다.

    sortDescriptors

    정렬 기준이 되는 SortDescriptor의 배열입니다.

    반환 값

    SectionedResults 의 인스턴스입니다.

Element.PersistedType: MinMaxType에서 사용 가능

  • min() 확장 메서드

    collection의 최소값(가장 낮은 값)을 반환하거나, collection이 비어 있는 경우 nil 을 반환합니다.

    선언

    스위프트

    func min() -> Element?
  • max() 확장 메서드

    컬렉션의 최대값(가장 높은 값)을 반환하거나, 컬렉션이 비어 있는 경우 nil 를 반환합니다.

    선언

    스위프트

    func max() -> Element?

Element.PersistedType: AddableType에서 사용 가능

  • sum() 확장 메서드

    collection에 있는 값의 합계를 반환하거나 collection이 비어 있는 경우 nil 을 반환합니다.

    선언

    스위프트

    func sum() -> Element
  • average() 확장 메서드

    컬렉션에 있는 모든 값의 평균을 반환합니다.

    선언

    스위프트

    func average<T>() -> T? where T : _HasPersistedType, T.PersistedType : AddableType

Element: KeypathSortable에서 사용 가능

  • sorted(byKeyPath:ascending:) 확장 메서드

    collection에 있지만 정렬된 객체를 포함하는 Results 을 반환합니다.

    객체는 지정된 키 경로의 값을 기준으로 정렬됩니다. 예를 들어, Studentcollection을 age 속성을 기준으로 가장 오래된 것부터 가장 오래된 것 순으로 정렬하려면 students.sorted(byKeyPath: "age", ascending: true) 를 호출할 수 있습니다.

    경고

    collection은 부울, Date, NSDate, 단일 및 배정밀도 부동 소수점, 정수, 문자열 유형의 속성을 통해서만 정렬할 수 있습니다.

    선언

    스위프트

    func sorted(byKeyPath keyPath: String, ascending: Bool = true) -> Results<Element>

    매개변수

    keyPath

    정렬 기준이 되는 키 경로입니다.

    ascending

    정렬할 방향입니다.

  • sorted(by:ascending:) 확장 메서드

    collection에 있지만 정렬된 객체를 포함하는 Results 을 반환합니다.

    객체는 지정된 키 경로의 값을 기준으로 정렬됩니다. 예를 들어, Studentcollection을 age 속성을 기준으로 가장 오래된 것부터 가장 오래된 것 순으로 정렬하려면 students.sorted(byKeyPath: "age", ascending: true) 를 호출할 수 있습니다.

    경고

    collection은 부울, Date, NSDate, 단일 및 배정밀도 부동 소수점, 정수, 문자열 유형의 속성을 통해서만 정렬할 수 있습니다.

    선언

    스위프트

    func sorted<T>(by keyPath: KeyPath<Element, T>, ascending: Bool = true) -> Results<Element> where T : _HasPersistedType, Self.Element : RLMObjectBase, T.PersistedType : SortableType

    매개변수

    keyPath

    정렬 기준이 되는 키 경로입니다.

    ascending

    정렬할 방향입니다.

  • distinct(by:) 기본 구현

    기본 구현

    지정된 키 경로를 기반으로 고유 객체가 포함된 Results 을 반환합니다.

    선언

    스위프트

    func distinct<S: Sequence>(by keyPaths: S) -> Results<Element>
        where S.Iterator.Element == PartialKeyPath<Element>, Element: ObjectBase

    매개변수

    keyPaths

    사용된 주요 경로는 뚜렷한 결과를 냅니다.

Element.PersistedType: SortableType에서 사용 가능

  • sorted(ascending:) 확장 메서드

    collection에 있지만 정렬된 객체를 포함하는 Results 을 반환합니다.

    객체는 해당 값을 기준으로 정렬됩니다. 예를 들어, Datecollection을 최신 항목에서 가장 오래된 항목 순으로 정렬하려면 dates.sorted(ascending: true) 을(를) 호출할 수 있습니다.

    선언

    스위프트

    func sorted(ascending: Bool = true) -> Results<Element>

    매개변수

    ascending

    정렬할 방향입니다.

  • distinct() 확장 메서드

    collection의 고유 값을 포함하는 Results 을 반환합니다.

    선언

    스위프트

    func distinct() -> Results<Element>

Element: ObjectBase에서 사용 가능

  • observe(keyPaths:on:_:) 기본 구현

    기본 구현

    collection이 변경될 때마다 호출될 블록을 등록합니다.

    블록은 초기 결과와 함께 비동기적으로 호출된 다음 컬렉션의 객체 또는 컬렉션에 있는 객체를 변경하는 각 쓰기 트랜잭션(write transaction) 후에 다시 호출됩니다.

    블록에 전달되는 change 매개변수는 각 쓰기 트랜잭션(write transaction) 중에 추가, 제거 또는 수정된 객체를 collection 내에서 인덱스 형식으로 보고합니다. 제공된 변경 정보에 대한 자세한 내용과 이를 사용하여 UITableView 을 업데이트하는 방법에 대한 예는 RealmCollectionChange 문서를 참조하세요.

    차단이 호출되는 시점에 collection은 완전히 평가되고 최신 상태이므로 동일한 스레드에서 쓰기 트랜잭션 (write transaction)을 수행하지 않거나 명시적으로 realm.refresh() 호출하지 않는 한 해당 스레드에 액세스하면 차단이 수행되지 않습니다. 일.

    대기열이 제공되지 않으면 표준 이벤트 루프를 통해 알림이 전달되므로 이벤트 루프가 다른 활동에 의해 차단되는 동안에는 알림을 전달할 수 없습니다. 대기열이 제공되면 대신 해당 대기열로 알림이 전달됩니다. 알림을 즉시 전달할 수 없는 경우 여러 알림이 단일 알림으로 병합될 수 있습니다. 여기에는 초기 collection에 대한 알림이 포함될 수 있습니다.

    예를 들어 다음 코드는 알림 차단을 추가한 직후 쓰기 트랜잭션(write transaction)을 수행하므로 초기 알림이 먼저 전달될 기회가 없습니다. 결과적으로 초기 알림에는 쓰기 트랜잭션(write transaction) 후 Realm의 상태가 반영됩니다.

    let dogs = realm.objects(Dog.self)
    print("dogs.count: \(dogs?.count)") // => 0
    let token = dogs.observe { changes in
        switch changes {
        case .initial(let dogs):
            // Will print "dogs.count: 1"
            print("dogs.count: \(dogs.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 Dog: Object {
        @Persisted var name: String
        @Persisted var age: Int
        @Persisted var toys: List<Toy>
    }
    // ...
    let dogs = realm.objects(Dog.self)
    
    let token = dogs.observe(keyPaths: [\Dog.name]) { changes in
        switch changes {
        case .initial(let dogs):
           // ...
        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.toys.brand] 인 경우 collection 요소의 toys 목록을 삽입하거나 삭제하면 trigger 됩니다. 이 collection의 Dog 에 연결된 Toybrand 값을 변경하면 차단이 trigger됩니다. 이 collection의 Dog 에 연결된 Toy 에서 brand 이외의 값을 변경해도 차단이 trigger되지 않습니다. 관찰 중인 Dog 유형 collection을 삽입하거나 제거하면 trigger 알림이 됩니다.
    • 위의 예에서 [\Dog.toys] 키 경로를 관찰한 경우 collection의 모든 요소에 대한 toys 목록을 삽입, 삭제 또는 수정하면 trigger가 됩니다. 이 컬렉션의 Dog 에 연결된 Toy 의 값을 변경해도 차단이 트리거 되지 않습니다 . 관찰 중인 Dog 유형 collection을 삽입하거나 제거해도 알림이 trigger됩니다.

    참고

    별도의 키 경로를 필터링하는 동일한 객체의 여러 알림 토큰은 독점적으로 필터링 되지 않습니다 . 하나의 알림 토큰에 대해 하나의 키 경로 변경이 충족되면 해당 객체에 대한 모든 알림 토큰 차단이 실행됩니다.

    블록에 업데이트를 전송하려는 한 반환된 토큰을 보관해야 합니다. 업데이트 수신을 중지하려면 토큰에서 invalidate() 을 호출합니다.

    경고

    쓰기 트랜잭션(write transaction) 중에는 또는 포함하는 Realm이 읽기 전용일 때 이 메서드를 호출할 수 없습니다.

    선언

    스위프트

    func observe(keyPaths: [PartialKeyPath<Element>],
                 on queue: DispatchQueue? = nil,
                 _ block: @escaping (RealmCollectionChange<Self>) -> Void) -> NotificationToken

    매개변수

    keyPaths

    키 경로 배열에 포함된 속성만 수정 시 trigger가 속성됩니다. 연결된 속성에 대한 자세한 내용은 위의 설명을 참조하세요.

    queue

    알림을 수신할 직렬 디스패치 대기열입니다. nil 인 경우 알림이 현재 스레드로 전달됩니다.

    block

    변경이 발생할 때마다 호출되는 차단입니다.

    반환 값

    업데이트가 전달되기를 원하는 기간 동안 보유해야 하는 토큰입니다.

  • observe(keyPaths:on:_:) 기본 구현, 비동기

    기본 구현

    collection이 변경될 때마다 호출될 블록을 등록합니다.

    블록은 collection의 초기 버전과 함께 비동기적으로 호출된 다음, collection의 객체 또는 collection에 있는 객체를 변경하는 각 쓰기 트랜잭션 (write transaction) 후에 다시 호출됩니다.

    차단에 전달된 actor 매개변수는 이 함수에 전달되는 행위자입니다. 이 매개변수는 콜백을 행위자에 격리하는 데 필요합니다.

    차단에 전달되는 change 매개변수는 collection 내에서 이전 알림 이후에 추가, 제거 또는 수정된 객체를 인덱스 형식으로 보고합니다. 변경 열거형의 collection 필드는 요청된 행위자로 격리되며 해당 행위자 내에서만 사용해도 안전합니다. 제공된 변경 정보에 대한 자세한 내용과 이를 사용하여 UITableView 을 업데이트하는 방법에 대한 예는 RealmCollectionChange 문서를 참조하세요.

    초기 알림이 전달되면 collection이 완전히 평가되어 최신 상태로 유지되며 collection에 액세스할 때 차단 작업을 수행하지 않습니다. 이 보장은 알림이 전달되는 동일한 행위자에 대해 쓰기 트랜잭션(write transaction)을 수행하지 않는 경우에만 적용됩니다. 이 경우 다음 알림이 전달되기 전에 collection에 액세스하려면 쿼리를 다시 실행해야 할 수 있습니다.

    알림은 지정된 행위자의 실행기로 전달됩니다. 알림을 즉시 전달할 수 없는 경우 여러 알림이 단일 알림으로 병합될 수 있습니다. 여기에는 초기 collection과의 알림이 포함될 수 있습니다. 초기 알림이 전달되기 전에 발생하는 쓰기는 변경 알림을 생성하지 않을 수 있습니다.

    collection에서 객체를 추가, 제거 또는 할당하면 항상 알림이 생성됩니다. 기본적으로, collection이 연결되는 객체(및 해당하는 경우 해당 객체가 연결되는 객체)를 수정하면, collection의 해당 인덱스가 수정 중인 것으로 보고됩니다. 비어 있지 않은 키 경로 배열이 제공되는 경우 해당 키 경로를 수정해야만 객체가 수정된 것으로 표시됩니다. 예를 들면 다음과 같습니다.

    class Dog: Object {
        @Persisted var name: String
        @Persisted var age: Int
        @Persisted var toys: List<Toy>
    }
    
    let dogs = realm.objects(Dog.self)
    let token = await dogs.observe(keyPaths: [\.name], on: myActor) { actor, changes in
        switch changes {
        case .initial(let dogs):
            // Query has finished running and dogs can not be used without blocking
        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:
            // Can no longer happen but is left for backwards compatiblity
        }
    }
    
    • 관찰된 키 경로가 [\.toys.brand] 인 경우 collection 요소의 toys 목록을 삽입하거나 삭제하면 trigger 됩니다. 이 collection의 Dog 에 연결된 Toybrand 값을 변경하면 차단이 trigger됩니다. 이 collection의 Dog 에 연결된 Toy 에서 brand 이외의 값을 변경해도 차단이 trigger되지 않습니다. 관찰 중인 Dog 유형 collection을 삽입하거나 제거하면 trigger 알림이 됩니다.
    • 위의 예에서 [\.toys] 키 경로를 관찰한 경우 collection의 모든 요소에 대한 toys 목록을 삽입, 삭제 또는 수정하면 trigger가 됩니다. 이 컬렉션의 Dog 에 연결된 Toy 의 값을 변경해도 차단이 트리거 되지 않습니다 . 관찰 중인 Dog 유형 collection을 삽입하거나 제거해도 알림이 trigger됩니다.

    블록에 업데이트를 전송하려는 한 반환된 토큰을 보관해야 합니다. 업데이트 수신을 중지하려면 토큰에서 invalidate() 을 호출합니다.

    경고

    쓰기 트랜잭션(write transaction) 중에는 또는 포함하는 Realm이 읽기 전용일 때 이 메서드를 호출할 수 없습니다.

    선언

    스위프트

    @available(macOS 10.15, tvOS 13.0, iOS 13.0, watchOS 6.0, *)
    @_unsafeInheritExecutor
    func observe<A: Actor>(keyPaths: [PartialKeyPath<Element>], on actor: A,
                           _ block: @Sendable @escaping (isolated A, RealmCollectionChange<Self>) -> Void) async -> NotificationToken

    매개변수

    keyPaths

    키 경로 배열에 포함된 속성만 수정 시 trigger가 속성됩니다. 비어 있으면 객체의 속성 변경에 대한 알림이 전달됩니다. 유효한 속성에 해당하지 않는 문자열 키 경로는 예외를 발생시킵니다. 연결된 속성에 대한 자세한 내용은 위의 설명을 참조하세요.

    actor

    알림을 격리할 행위자입니다.

    block

    변경이 발생할 때마다 호출되는 차단입니다.

    반환 값

    업데이트가 전달되기를 원하는 기간 동안 보유해야 하는 토큰입니다.