RealmSectionedResult
public protocol RealmSectionedResult : ThreadConfined, Equatable, RandomAccessCollection
RealmSectionedResult
define propriedades e métodos que são comuns entre SectionedResults
e ResultSection
.
-
O Realm que gerencia a coleção, ou
nil
se a coleção for invalidada.Declaração
Swift
var realm: Realm? { get }
-
Indica se a collection não pode mais ser acessada.
A coleção não poderá mais ser acessada se
invalidate()
for chamado noRealm
que gerencia a coleção.Declaração
Swift
var isInvalidated: Bool { get }
-
O número de objetos na collection.
Declaração
Swift
var count: Int { get }
-
Retorna verdadeiro se esta collection estiver congelada
Declaração
Swift
var isFrozen: Bool { get }
-
Retorna um snapshot congelado (imutável) desta collection.
A cópia congelada é uma coleção imutável que contém os mesmos dados que esta coleção contém atualmente, mas não será atualizada quando forem feitas gravações no Realm que a contém. Ao contrário das collections ativas, as collections congeladas podem ser acessadas de qualquer thread.
Aviso
Este método não pode ser chamado durante uma transação de escrita, ou quando o Realm que o contém for somente leitura.Aviso
Manter uma collection congelada por um longo período enquanto executa transação de escrita no Realm pode fazer com que o Arquivo de Realm cresça para tamanhos grandes. ConsulteRealm.Configuration.maximumNumberOfActiveVersions
para obter mais informações.Declaração
Swift
func freeze() -> Self
-
Retorna uma versão ativa (mutável) dessa collection congelada.
Esse método resolve uma referência a uma cópia ativa da mesma collection congelada. Se for chamado em uma coleção ativa, retornará a si mesmo.
Declaração
Swift
func thaw() -> Self?
-
observe(keyPaths:
Implementação padrãoon: _: ) Registra um bloco a ser chamado sempre que a coleção de resultados seccionada for alterada.
O bloco será chamado de forma assíncrona com a coleção inicial de resultados seccionados e, em seguida, chamado novamente após cada transação de escrita que altere qualquer um dos objetos na coleção de resultados seccionada ou quais objetos estão na coleção de resultados seccionada.
O parâmetro
change
que é passado para o bloco reporta, na forma de índices dentro da collection, quais dos objetos foram adicionados, removidos ou modificados durante cada transação de escrita. Consulte a documentação doSectionedResultsChange
para obter mais informações sobre as informações de alteração fornecidas e um exemplo de como usá-las para atualizar umUITableView
.No momento em que o bloqueio for chamado, a coleção será totalmente avaliada e atualizada e, desde que você não execute uma transação de gravação na mesma thread ou chame explicitamente
realm.refresh()
, acessá-la nunca executará o bloqueio trabalho.Se nenhuma fila for fornecida, as notificações serão entregues por meio do loop de execução padrão e, portanto, não poderão ser entregues enquanto o loop de execução estiver bloqueado por outras atividades. Se uma fila for fornecida, as notificações serão entregues nessa fila. Quando as notificações não podem ser entregues instantaneamente, várias notificações podem ser agrupadas em uma única notificação. Isso pode incluir a notificação com a coleção inicial de resultados seccionados.
Por exemplo, o código a seguir executa uma transação de escrita imediatamente após adicionar o bloqueio de notificação, para que não haja oportunidade para que a notificação inicial seja entregue primeiro. Como resultado, a notificação inicial refletirá o estado do Realm após a transação de escrita.
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
Se nenhum caminho-chave for fornecido, o bloqueio será executado em qualquer inserção, modificação ou exclusão para todas as propriedades do objeto e as propriedades de quaisquer objetos vinculados aninhados. Se um caminho de chave ou caminhos de chave forem fornecidos, o bloco será chamado para alterações que ocorrem apenas nos caminhos de chave fornecidos. Por exemplo, se:
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
- Se o caminho da chave observado fosse
["toys.brand"]
, qualquer inserção ou exclusão na listatoys
em qualquer um dos elementos da collection trigger o bloqueio. Alterações no valorbrand
em qualquerToy
vinculado a umDog
nessa collection triggerão o bloqueio. Alterações em um valor diferente debrand
em qualquerToy
vinculado a umDog
nessa collection não trigger o bloqueio. Qualquer inserção ou remoção na collection de tiposDog
que está sendo observada também trigger uma notificação. - Se o exemplo acima observasse o caminho da chave
["toys"]
, qualquer inserção, exclusão ou modificação na listatoys
para qualquer elemento da collection trigger o bloqueio. Alterações em qualquer valor em qualquerToy
que esteja vinculado a umDog
nesta collection não trigger o bloqueio. Qualquer inserção ou remoção na collection de tiposDog
que está sendo observada ainda trigger uma notificação. Qualquer modificação na propriedade de caminho da chave da seção que resulte na mudança de posição do objeto na seção ou na alteração totalmente da seção trigger uma notificação.
Observação
Vários tokens de notificação no mesmo objeto que filtram exclusivamente caminhos de chave separados não filtram. Se uma alteração de caminho-chavefor satisfeita para um token de notificação, todos os bloqueios de token de notificação para esse objeto serão executados.
Você deve reter o token retornado pelo tempo que desejar que as atualizações sejam enviadas ao bloco. Para parar de receber atualizações, ligue para
invalidate()
no token.Aviso
Este método não pode ser chamado durante uma transação de escrita, ou quando o Realm que o contém for somente leitura.
Implementação padrão
Declaração
Swift
func observe(keyPaths: [String]?, on queue: DispatchQueue?, _ block: @escaping (SectionedResultsChange<Self>) -> Void) -> NotificationToken
Parâmetros
keyPaths
Somente a propriedade contida na array de caminhos principais vai trigger o bloqueio quando forem modificadas. Se
nil
, notificações serão entregues para qualquer alteração de propriedade no objeto. Os caminhos da chave de string que não correspondem a uma propriedade válida lançarão uma exceção. Consulte a descrição acima para obter mais detalhes sobre propriedades vinculadas.queue
A fila de despacho em série para receber a notificação. Se
nil
, as notificações são entregues ao thread atual.block
O bloco a ser chamado sempre que ocorre uma alteração.
Valor de retorno
Um token que deve ser mantido pelo tempo que você quiser que as atualizações sejam entregues.
- Se o caminho da chave observado fosse
-
observe(keyPaths:
Implementação padrãoon: _: ) Implementação padrão
Registra um bloco a ser chamado sempre que a coleção de resultados seccionada for alterada.
O bloco será chamado de forma assíncrona com a coleção inicial de resultados seccionados e, em seguida, chamado novamente após cada transação de escrita que altere qualquer um dos objetos na coleção de resultados seccionada ou quais objetos estão na coleção de resultados seccionada.
O parâmetro
change
que é passado para o bloco reporta, na forma de índices dentro da collection, quais dos objetos foram adicionados, removidos ou modificados durante cada transação de escrita. Consulte a documentação doSectionedResultsChange
para obter mais informações sobre as informações de alteração fornecidas e um exemplo de como usá-las para atualizar umUITableView
.No momento em que o bloqueio for chamado, a coleção será totalmente avaliada e atualizada e, desde que você não execute uma transação de gravação na mesma thread ou chame explicitamente
realm.refresh()
, acessá-la nunca executará o bloqueio trabalho.Se nenhuma fila for fornecida, as notificações serão entregues por meio do loop de execução padrão e, portanto, não poderão ser entregues enquanto o loop de execução estiver bloqueado por outras atividades. Se uma fila for fornecida, as notificações serão entregues nessa fila. Quando as notificações não podem ser entregues instantaneamente, várias notificações podem ser agrupadas em uma única notificação. Isso pode incluir a notificação com a coleção inicial de resultados seccionados.
Por exemplo, o código a seguir executa uma transação de escrita imediatamente após adicionar o bloqueio de notificação, para que não haja oportunidade para que a notificação inicial seja entregue primeiro. Como resultado, a notificação inicial refletirá o estado do Realm após a transação de escrita.
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
Se nenhum caminho-chave for fornecido, o bloqueio será executado em qualquer inserção, modificação ou exclusão para todas as propriedades do objeto e as propriedades de quaisquer objetos vinculados aninhados. Se um caminho de chave ou caminhos de chave forem fornecidos, o bloco será chamado para alterações que ocorrem apenas nos caminhos de chave fornecidos. Por exemplo, se:
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
- Se o caminho da chave observado fosse
["toys.brand"]
, qualquer inserção ou exclusão na listatoys
em qualquer um dos elementos da collection trigger o bloqueio. Alterações no valorbrand
em qualquerToy
vinculado a umDog
nessa collection triggerão o bloqueio. Alterações em um valor diferente debrand
em qualquerToy
vinculado a umDog
nessa collection não trigger o bloqueio. Qualquer inserção ou remoção na collection de tiposDog
que está sendo observada também trigger uma notificação. - Se o exemplo acima observasse o caminho da chave
["toys"]
, qualquer inserção, exclusão ou modificação na listatoys
para qualquer elemento da collection trigger o bloqueio. Alterações em qualquer valor em qualquerToy
que esteja vinculado a umDog
nesta collection não trigger o bloqueio. Qualquer inserção ou remoção na collection de tiposDog
que está sendo observada ainda trigger uma notificação. Qualquer modificação na propriedade de caminho da chave da seção que resulte na mudança de posição do objeto na seção ou na alteração totalmente da seção trigger uma notificação.
Observação
Vários tokens de notificação no mesmo objeto que filtram exclusivamente caminhos de chave separados não filtram. Se uma alteração de caminho-chavefor satisfeita para um token de notificação, todos os bloqueios de token de notificação para esse objeto serão executados.
Você deve reter o token retornado pelo tempo que desejar que as atualizações sejam enviadas ao bloco. Para parar de receber atualizações, ligue para
invalidate()
no token.Aviso
Este método não pode ser chamado durante uma transação de escrita, ou quando o Realm que o contém for somente leitura.
Declaração
Swift
func observe(keyPaths: [PartialKeyPath<Element.Element>], on queue: DispatchQueue? = nil, _ block: @escaping (SectionedResultsChange<Self>) -> Void) -> NotificationToken
Parâmetros
keyPaths
Somente as propriedades contidas na array de caminhos principais trigger o bloqueio quando forem modificadas. Se
nil
, notificações serão entregues para qualquer alteração de propriedade no objeto.queue
A fila de despacho em série para receber a notificação. Se
nil
, as notificações são entregues ao thread atual.block
O bloco a ser chamado sempre que ocorre uma alteração.
Valor de retorno
Um token que deve ser mantido pelo tempo que você quiser que as atualizações sejam entregues.
- Se o caminho da chave observado fosse
-
observe(keyPaths:
Implementação padrãoon: _: ) Implementação padrão
Registra um bloco a ser chamado sempre que a coleção de resultados seccionada for alterada.
O bloco será chamado de forma assíncrona com a coleção inicial de resultados seccionados e, em seguida, chamado novamente após cada transação de escrita que altere qualquer um dos objetos na coleção de resultados seccionada ou quais objetos estão na coleção de resultados seccionada.
O parâmetro
change
que é passado para o bloco reporta, na forma de índices dentro da collection, quais dos objetos foram adicionados, removidos ou modificados durante cada transação de escrita. Consulte a documentação doSectionedResultsChange
para obter mais informações sobre as informações de alteração fornecidas e um exemplo de como usá-las para atualizar umUITableView
.No momento em que o bloqueio for chamado, a coleção será totalmente avaliada e atualizada e, desde que você não execute uma transação de gravação na mesma thread ou chame explicitamente
realm.refresh()
, acessá-la nunca executará o bloqueio trabalho.Se nenhuma fila for fornecida, as notificações serão entregues por meio do loop de execução padrão e, portanto, não poderão ser entregues enquanto o loop de execução estiver bloqueado por outras atividades. Se uma fila for fornecida, as notificações serão entregues nessa fila. Quando as notificações não podem ser entregues instantaneamente, várias notificações podem ser agrupadas em uma única notificação. Isso pode incluir a notificação com a coleção inicial de resultados seccionados.
Por exemplo, o código a seguir executa uma transação de escrita imediatamente após adicionar o bloqueio de notificação, para que não haja oportunidade para que a notificação inicial seja entregue primeiro. Como resultado, a notificação inicial refletirá o estado do Realm após a transação de escrita.
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
Se nenhum caminho-chave for fornecido, o bloqueio será executado em qualquer inserção, modificação ou exclusão para todas as propriedades do objeto e as propriedades de quaisquer objetos vinculados aninhados. Se um caminho de chave ou caminhos de chave forem fornecidos, o bloco será chamado para alterações que ocorrem apenas nos caminhos de chave fornecidos. Por exemplo, se:
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
- Se o caminho da chave observado fosse
["toys.brand"]
, qualquer inserção ou exclusão na listatoys
em qualquer um dos elementos da collection trigger o bloqueio. Alterações no valorbrand
em qualquerToy
vinculado a umDog
nessa collection triggerão o bloqueio. Alterações em um valor diferente debrand
em qualquerToy
vinculado a umDog
nessa collection não trigger o bloqueio. Qualquer inserção ou remoção na collection de tiposDog
que está sendo observada também trigger uma notificação. - Se o exemplo acima observasse o caminho da chave
["toys"]
, qualquer inserção, exclusão ou modificação na listatoys
para qualquer elemento da collection trigger o bloqueio. Alterações em qualquer valor em qualquerToy
que esteja vinculado a umDog
nesta collection não trigger o bloqueio. Qualquer inserção ou remoção na collection de tiposDog
que está sendo observada ainda trigger uma notificação. Qualquer modificação na propriedade de caminho da chave da seção que resulte na mudança de posição do objeto na seção ou na alteração totalmente da seção trigger uma notificação.
Observação
Vários tokens de notificação no mesmo objeto que filtram exclusivamente caminhos de chave separados não filtram. Se uma alteração de caminho-chavefor satisfeita para um token de notificação, todos os bloqueios de token de notificação para esse objeto serão executados.
Você deve reter o token retornado pelo tempo que desejar que as atualizações sejam enviadas ao bloco. Para parar de receber atualizações, ligue para
invalidate()
no token.Aviso
Este método não pode ser chamado durante uma transação de escrita, ou quando o Realm que o contém for somente leitura.
Declaração
Swift
func observe(keyPaths: [PartialKeyPath<Element>], on queue: DispatchQueue? = nil, _ block: @escaping (SectionedResultsChange<Self>) -> Void) -> NotificationToken
Parâmetros
keyPaths
Somente as propriedades contidas na array de caminhos principais trigger o bloqueio quando forem modificadas. Se
nil
, notificações serão entregues para qualquer alteração de propriedade no objeto.queue
A fila de despacho em série para receber a notificação. Se
nil
, as notificações são entregues ao thread atual.block
O bloco a ser chamado sempre que ocorre uma alteração.
Valor de retorno
Um token que deve ser mantido pelo tempo que você quiser que as atualizações sejam entregues.
- Se o caminho da chave observado fosse