ProjectedCollection

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

ProjectedCollection は、プロジェクションのプロパティの特殊なタイプのコレクションであり、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>
}
  • 宣言

    Swift

    public typealias Index = Int
  • 述語に一致するリスト内の最初のオブジェクトのインデックスを返します。一致するオブジェクトがない場合はnilを返します。

    宣言

    Swift

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

    パラメーター

    predicate

    オブジェクトをフィルタリングする述語。

  • コレクションが変更されるたびに呼び出されるブロックを登録します。

    ブロックは初期結果とは非同期に呼び出され、コレクション内のいずれかのオブジェクトまたはコレクション内のどのオブジェクトのいずれかを変更する書込みトランザクションごとに再度呼び出されます。

    ブロックに渡されるchangeパラメータは、各書込みトランザクション中に追加、削除、または変更されたオブジェクトをコレクション内のインデックスの形式で報告します。 提供される変更情報の詳細と、その変更情報を使用してUITableViewをアップデートする方法の例については、 RealmCollectionChangeのドキュメントを参照してください。

    ブロックが呼び出される時点で、コレクションは完全に評価され、最新の状態になります。また、同じスレッドで書込みトランザクションを実行したり、 realm.refresh()を明示的に呼び出したりしない限り、アクセスに関するブロッキングは実行されません動作する。

    キューが指定されていない場合、通知は標準の実行ループを介して配信されるため、実行ループが他のアクティビティによってブロックされている間は通知を配信できません。 キューが指定されている場合、代わりにそのキューに通知が配信されます。 通知をすぐに配信できない場合は、複数の通知が 1 つの通知に統合されることがあります。 これには、初期コレクションの通知を含めることができます。

    たとえば、次のコードは通知ブロックを追加した後すぐに書込みトランザクションを実行するため、最初の通知が最初に配信される可能性はありません。 その結果、最初の通知には、書込みトランザクション後の 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()を呼び出します。

    警告

    このメソッドは、書込みトランザクション中、または Realm を含む が読み取り専用の場合に呼び出すことができません。

    宣言

    Swift

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

    パラメーター

    queue

    通知を受信するシリアル ディスパッチ キュー。 nilの場合、通知は現在のスレッドに配信されます。

    block

    変更が発生するたびに呼び出されるブロック。

    戻り値

    更新を配信する限り保持する必要があるトークン。

  • コレクションが変更されるたびに呼び出されるブロックを登録します。

    ブロックは初期結果とは非同期に呼び出され、コレクション内のいずれかのオブジェクトまたはコレクション内のどのオブジェクトのいずれかを変更する書込みトランザクションごとに再度呼び出されます。

    ブロックに渡されるchangeパラメータは、各書込みトランザクション中に追加、削除、または変更されたオブジェクトをコレクション内のインデックスの形式で報告します。 提供される変更情報の詳細と、その変更情報を使用してUITableViewをアップデートする方法の例については、 RealmCollectionChangeのドキュメントを参照してください。

    ブロックが呼び出される時点で、コレクションは完全に評価され、最新の状態になります。また、同じスレッドで書込みトランザクションを実行したり、 realm.refresh()を明示的に呼び出したりしない限り、アクセスに関するブロッキングは実行されません動作する。

    キューが指定されていない場合、通知は標準の実行ループを介して配信されるため、実行ループが他のアクティビティによってブロックされている間は通知を配信できません。 キューが指定されている場合、代わりにそのキューに通知が配信されます。 通知をすぐに配信できない場合は、複数の通知が 1 つの通知に統合されることがあります。 これには、初期コレクションの通知を含めることができます。

    たとえば、次のコードは通知ブロックを追加した後すぐに書込みトランザクションを実行するため、最初の通知が最初に配信される可能性はありません。 その結果、最初の通知には、書込みトランザクション後の 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
    

    このコレクション内の にリンクされている他の値を変更しても、ブロックはDogtrigger され ません 。監視対象の Dog 型コレクションへの挿入または削除によって通知がtriggerされます。

    注意

    個別のキー パスでフィルタリングされる同じオブジェクト上の複数の通知トークンは、排他的にフィルタリングされません。 1 つの通知トークンに対して 1 つのキーパスの変更が満たされた場合、そのオブジェクトのすべての通知トークン ブロックが実行されます。

    アップデートをブロックに送信する場合は、返されたトークンを保持する必要があります。 更新の受信を停止するには、トークンでinvalidate()を呼び出します。

    警告

    このメソッドは、書込みトランザクション中、または Realm を含む が読み取り専用の場合に呼び出すことができません。

    宣言

    Swift

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

    パラメーター

    keyPaths

    キーパス配列に含まれるプロパティのみが変更されたときにブロックをtriggerします。 nilの場合、オブジェクトのプロパティ変更に対して通知が配信されます。 有効な プロパティに対応していないstringキー パスでは例外がスローされます。 リンクされたプロパティの詳細については、上記の説明を参照してください。

    queue

    通知を受信するシリアル ディスパッチ キュー。 nilの場合、通知は現在のスレッドに配信されます。

    block

    変更が発生するたびに呼び出されるブロック。

    戻り値

    更新を配信する限り保持する必要があるトークン。

  • 指定されたインデックスのオブジェクトを返します(get)、または指定されたインデックスのオブジェクトを置き換えます(set)。

    警告

    書込みトランザクション中にのみオブジェクトを設定できます。

    宣言

    Swift

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

    パラメーター

    index

    検索または置換するオブジェクトのインデックス。

  • 空でないコレクション内の最初の要素の位置。 空のコレクション内の endIndex と同じ。

    宣言

    Swift

    public var startIndex: Int { get }
  • コレクションの「終了を過ぎた」位置。 endIndex はサブスクリプトへの有効な引数ではなく、成功します()の 0 個以上のアプリケーションによって startIndex から常にアクセス可能です。

    宣言

    Swift

    public var endIndex: Int { get }
  • オブジェクトを管理する Realm。

    宣言

    Swift

    public var realm: Realm? { get }
  • コレクションがアクセスできなくなっているかどうかを示します。

    宣言

    Swift

    public var isInvalidated: Bool { get }
  • 人間が判読可能なオブジェクトの説明。

    宣言

    Swift

    public var description: String { get }
  • リンク オブジェクト内のオブジェクトのインデックスを返します。オブジェクトが存在しない場合はnilを返します。

    宣言

    Swift

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

    パラメーター

    object

    インデックスがクエリされているオブジェクト。

  • 宣言

    Swift

    public var isFrozen: Bool { get }
  • 宣言

    Swift

    public func freeze() -> ProjectedCollection<Element>
  • 宣言

    Swift

    public func thaw() -> `Self`?