RealmSectionedResult

public protocol RealmSectionedResult : ThreadConfined, Equatable, RandomAccessCollection

RealmSectionedResult SectionedResultsResultSection 간에 공통된 속성과 메서드를 정의합니다.

속성

  • 컬렉션을 관리하는 Realm이거나 컬렉션이 무효화된 경우 nil 입니다.

    선언

    Swift

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

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

    선언

    Swift

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

    선언

    Swift

    var count: Int { get }
  • 이 collection이 동결되면 true를 반환합니다.

    선언

    Swift

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

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

    경고

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

    경고

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

    선언

    Swift

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

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

    선언

    Swift

    func thaw() -> Self?
  • observe(keyPaths:on:_:) 기본 구현

    섹션화된 결과 컬렉션이 변경될 때마다 호출될 블록을 등록합니다.

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

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

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

    대기열이 지정되지 않으면 표준 런 루프를 통해 알림이 전달되므로 다른 활동에 의해 런 루프가 차단된 동안에는 알림을 전달할 수 없습니다. 대기열이 지정되면 대신 해당 대기열로 알림이 전달됩니다. 알림을 즉시 전달할 수 없는 경우 여러 알림이 단일 알림으로 통합될 수 있습니다. 여기에는 초기 섹션 결과 컬렉션에 대한 알림이 포함될 수 있습니다.

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

    let dogs = realm.objects(Dog.self)
    let sectionedResults = dogs.sectioned(by: \.age, ascending: true)
    print("sectionedResults.count: \(sectionedResults?.count)") // => 0
    let token = sectionedResults.observe { changes in
        switch changes {
        case .initial(let sectionedResults):
            // Will print "sectionedResults.count: 1"
            print("sectionedResults.count: \(sectionedResults.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 sectionedResults = dogs.sectioned(by: \.age, ascending: true)
    let token = sectionedResults.observe(keyPaths: ["name"]) { changes in
        switch changes {
        case .initial(let sectionedResults):
           // ...
        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됩니다.
    • 섹션 키 경로 속성 을 수정하여 객체 가 섹션에서 위치를 변경하거나 섹션이 완전히 변경되면 알림이 trigger 됩니다.

    참고

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

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

    경고

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

    기본 구현

    선언

    Swift

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

    매개변수

    keyPaths

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

    queue

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

    block

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

    반환 값

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

Element: RealmSectionedResult, Element.Element: ObjectBase에서 사용 가능

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

    기본 구현

    섹션화된 결과 컬렉션이 변경될 때마다 호출될 블록을 등록합니다.

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

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

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

    대기열이 지정되지 않으면 표준 런 루프를 통해 알림이 전달되므로 다른 활동에 의해 런 루프가 차단된 동안에는 알림을 전달할 수 없습니다. 대기열이 지정되면 대신 해당 대기열로 알림이 전달됩니다. 알림을 즉시 전달할 수 없는 경우 여러 알림이 단일 알림으로 통합될 수 있습니다. 여기에는 초기 섹션 결과 컬렉션에 대한 알림이 포함될 수 있습니다.

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

    let dogs = realm.objects(Dog.self)
    let sectionedResults = dogs.sectioned(by: \.age, ascending: true)
    print("sectionedResults.count: \(sectionedResults?.count)") // => 0
    let token = sectionedResults.observe { changes in
        switch changes {
        case .initial(let sectionedResults):
            // Will print "sectionedResults.count: 1"
            print("sectionedResults.count: \(sectionedResults.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 sectionedResults = dogs.sectioned(by: \.age, ascending: true)
    let token = sectionedResults.observe(keyPaths: ["name"]) { changes in
        switch changes {
        case .initial(let sectionedResults):
           // ...
        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됩니다.
    • 섹션 키 경로 속성 을 수정하여 객체 가 섹션에서 위치를 변경하거나 섹션이 완전히 변경되면 알림이 trigger 됩니다.

    참고

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

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

    경고

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

    선언

    Swift

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

    매개변수

    keyPaths

    키 경로 배열에 포함된 속성만 수정될 때 차단을 trigger 합니다. nil 인 경우 객체의 속성 변경에 대한 알림이 전달됩니다.

    queue

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

    block

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

    반환 값

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

Element: ObjectBase에서 사용 가능

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

    기본 구현

    섹션화된 결과 컬렉션이 변경될 때마다 호출될 블록을 등록합니다.

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

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

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

    대기열이 지정되지 않으면 표준 런 루프를 통해 알림이 전달되므로 다른 활동에 의해 런 루프가 차단된 동안에는 알림을 전달할 수 없습니다. 대기열이 지정되면 대신 해당 대기열로 알림이 전달됩니다. 알림을 즉시 전달할 수 없는 경우 여러 알림이 단일 알림으로 통합될 수 있습니다. 여기에는 초기 섹션 결과 컬렉션에 대한 알림이 포함될 수 있습니다.

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

    let dogs = realm.objects(Dog.self)
    let sectionedResults = dogs.sectioned(by: \.age, ascending: true)
    print("sectionedResults.count: \(sectionedResults?.count)") // => 0
    let token = sectionedResults.observe { changes in
        switch changes {
        case .initial(let sectionedResults):
            // Will print "sectionedResults.count: 1"
            print("sectionedResults.count: \(sectionedResults.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 sectionedResults = dogs.sectioned(by: \.age, ascending: true)
    let token = sectionedResults.observe(keyPaths: ["name"]) { changes in
        switch changes {
        case .initial(let sectionedResults):
           // ...
        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됩니다.
    • 섹션 키 경로 속성 을 수정하여 객체 가 섹션에서 위치를 변경하거나 섹션이 완전히 변경되면 알림이 trigger 됩니다.

    참고

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

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

    경고

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

    선언

    Swift

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

    매개변수

    keyPaths

    키 경로 배열에 포함된 속성만 수정될 때 차단을 trigger 합니다. nil 인 경우 객체의 속성 변경에 대한 알림이 전달됩니다.

    queue

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

    block

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

    반환 값

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