ProjectedCollection

public struct ProjectedCollection<Element> : RandomAccessCollection, CustomStringConvertible, ThreadConfined where Element : RealmCollectionValue

ProjectedCollection é um tipo especial de collection para as propriedade de projeção que deve ser usado quando você deseja projeto um List de Objeto de Realm em uma lista de valores. Você não precisa instanciar esse tipo manualmente. Use-o chamando projectTo em uma propriedade List :

class PersistedListObject: Object {
    @Persisted public var people: List<CommonPerson>
}

class ListProjection: Projection<PersistedListObject> {
    @Projected(\PersistedListObject.people.projectTo.firstName) var strings: ProjectedCollection<String>
}
  • Declaração

    Swift

    public typealias Index = Int
  • Retorna o índice do primeiro objeto na lista que corresponde ao predicado ou nil se nenhum objeto corresponder.

    Declaração

    Swift

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

    Parâmetros

    predicate

    O predicado com o qual filtrar os objetos.

  • Registra um bloco a ser chamado cada vez que a collection for alterada.

    O bloco será chamado de forma assíncrona com os resultados iniciais e, em seguida, chamado novamente após cada transação de gravação que altere qualquer um dos objetos da coleção ou quais objetos estão na coleção.

    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 do RealmCollectionChange para obter mais informações sobre as informações de alteração fornecidas e um exemplo de como usá-las para atualizar um UITableView .

    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 outra atividade. Se uma fila for fornecida, as notificações serão entregues para essa 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.

    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.

    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
    

    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

    public func observe(on queue: DispatchQueue?,
                        _ block: @escaping (RealmCollectionChange<ProjectedCollection<Element>>) -> Void) -> NotificationToken

    Parâmetros

    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.

  • Registra um bloco a ser chamado cada vez que a collection for alterada.

    O bloco será chamado de forma assíncrona com os resultados iniciais e, em seguida, chamado novamente após cada transação de gravação que altere qualquer um dos objetos da coleção ou quais objetos estão na coleção.

    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 do RealmCollectionChange para obter mais informações sobre as informações de alteração fornecidas e um exemplo de como usá-las para atualizar um UITableView .

    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 outra atividade. Se uma fila for fornecida, as notificações serão entregues para essa 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.

    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.

    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
    

    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 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
    

    Alterações em qualquer outro valor vinculado a um Dog nessa coleção não trigger o bloqueio. Qualquer inserção ou remoção na coleção de tipos Dog que está sendo observada ainda 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

    public func observe(keyPaths: [String]? = nil, on queue: DispatchQueue? = nil,
                        _ block: @escaping (RealmCollectionChange<ProjectedCollection<Element>>) -> 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.

  • Retorna o objeto no índice fornecido (obter) ou substitui o objeto no índice fornecido (conjunto).

    Aviso

    Você só pode definir um objeto durante uma transação de escrita.

    Declaração

    Swift

    public subscript(position: Int) -> Element { get set }

    Parâmetros

    index

    O índice do objeto a ser recuperado ou substituído.

  • A posição do primeiro elemento em uma coleção não vazia. Idêntico ao endIndex em uma coleta vazia.

    Declaração

    Swift

    public var startIndex: Int { get }
  • A posição "além do final" da collection. endIndex não é um argumento válido para subscrito e está sempre acessível a partir de startIndex por zero ou mais aplicações de sucessor ().

    Declaração

    Swift

    public var endIndex: Int { get }
  • O Realm que gerencia o objeto.

    Declaração

    Swift

    public var realm: Realm? { get }
  • Indica se a collection não pode mais ser acessada.

    Declaração

    Swift

    public var isInvalidated: Bool { get }
  • Uma descrição legível por humanos do objeto.

    Declaração

    Swift

    public var description: String { get }
  • Retorna o índice de um objeto nos objetos de vinculação ou nil se o objeto não estiver presente.

    Declaração

    Swift

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

    Parâmetros

    object

    O objeto cujo índice está sendo consultado.

  • Declaração

    Swift

    public var isFrozen: Bool { get }
  • Declaração

    Swift

    public func freeze() -> ProjectedCollection<Element>
  • Declaração

    Swift

    public func thaw() -> `Self`?